关于自增自减运算符的一些问题


 

1、作用是使变量的值增1或减1。

例如:

++i, --i   (在使用i之前,先使i的值加(减)1)

i++, i--   (在使用i之后,使i的值加(减)1)

 

其中++i和i++的作用相当于i=i+1。但是++i和i++不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。如果i的原值等于3,请分析下面的赋值语句:

 

j=++i; //i的值先变成4,再赋值给j,j的值才为4

j=i++; //先将i的值3赋给j,j的值为3,然后i变为4

 

又例如:

i=3;

printf(%d,++i);  //输出4,此时i=4

若改为:

printf(%d,i++);  //输出3,此时i=4

 

注意:

(1) 自增运算符和自减运算符只能用于变量,而不能用于常亮或表达式,如5++或(a+b)++都是不合法的。应为5是常量,常量的值不能改变。(a+b)++也不可能实现,假如a+b的值为5,那么自增后得到的6放到什么地方呢?无变量可供存放!

(2)  ++ 和—的结合方向是“自右向左”(可以参考C语言运算符和结合性表)。一般情况下算数运算符的结合方向为“自左向右”,如果有-i++,i的左面是负号运算符,右面是自加运算符。如果i的原值等于3,若按照左结合性,相当于(-i)++,而(-i)++是不合法的,应为对表达式不能进行自加自减运算。

如果有printf(“%d”,-i++);,则先取出i的值3,输出-i的值-3,然后i增加为4

注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为先加完1后再加负号,输出-4,这是不对的。

(3)  自增(减)运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针变量指向下一个内存地址。

 

2、有关次类表达式使用中的一些问题汇总

(1) C运算符和表达式使用灵活,利用这一点可以巧妙地处理许多在其他语言中难以处理地问题。但是应当注意:ANSI C并没有具体规定表达式中地子表达式地求值顺序,允许各编译系统自己安排。

例如,对表达式:

a = f1( ) + f2( )

 

问题:表达式的值是多少呢?

解析:并不是所有地编译系统都先调用函数f1( ),然后调用函数f2( )。在一般情况下,先调用f1( )和先调用f2( )的结果可能相同。但是在有些特殊情况下结果可能不同。有时会出现一些令人容易混淆的问题,务必要小心谨慎。

 

 

又如,i的初始值为3,有以下表达式:

int i=3;

int j = (i++)+(i++)+(i++);

 

问题:表达式的值是多少呢?

解析:有的编译系统按照自左向右顺序执行括号内的运算,求解完第1个括号的值后会实现i的自加,i值变为4,再求第2个括号的值,结果表达式相当于3+4+5,即12。而另外一些系统(如Turbo C和MS C)把3作为表达式中所有i的值,因此3个i相加,得到表达式的值为9。在求出整个表达式的值后i变量再实现自加3次,i的值变为6

 

应该避免出现这种歧义性。如果编程人员的意愿是想得到12,可以写成下列语句:

int i = 3;

int a = i++;

int b = i++;

int c = i++;

int d = a + b + c;

执行完毕之后,d的值为12,i的值为6。虽然语句复杂,但是不会产生歧义,无论程序移植到哪一种C编译系统运行,其结果都是一样的。

 

(2) C语言中有的运算符为一个字符,有的运算符由两个字符组成,在表达式中如何组合呢?

 

问题:如i+++j,是理解为(i++)+j呢?还是i+(++j)呢?

解析:C编译系统在处理时尽可能多地(自左向右)将若干个字符组成一个运算符(在处理标识符、关键字时也按同一原则处理),如i+++j,将解释为(i++)+j,而不是i+(++j)。

 

为避免误解,最好采取大家都能理解地写法,不要写成i+++j的形式,而应写成(i++)+j的形式。

 

(3) C语言中类似上述问题还有一些。例如,在调用函数时,实参的求值顺序的问题,C标准并无统一规定。

例如i的初始值为3,如果有下面的函数调用

int i = 3;

printf(“%d, %d”,i,i++);

 

问题:以上程序输出结果如何呢?

解析:在有的编译系统中,从左至右求值,输出“3, 3”。在多数编译系统中对函数参数的求值顺序是自右而左,上面printf( )函数中要输出两个表达式的值(i和i++分别是两个表达式),先求出第二个表达式i++的值3(i未自加时的值),然后求第一个表达式i的值,由于在求解第二个表达式后,执行i++,使i加1变为4,因此printf( )函数中第一个参数i的值为4。所以上面printf( )函数输出的是“4, 3”

以上这种写法不宜提倡,最好改写成

int j = i++;

printf(“%d, %d”,i,j)

 

总之,不要写出别人看不懂的、也不知道系统会则样执行的程序。(不要以为自己很牛,去出一些不能说明什么问题的题目考别人,这样的题目直接滤过,只能说明你的编程质量很低下)

在看别人的程序时,应该考虑到在此类似上述问题上,不同系统的处理方法不尽相同。应当知道使用C语言时可能出问题的地方,以免遇到问题时不知其所以然。

(4) 使用++ 和 -- 时,常会出现一些人们“想不到”的副作用,初学者要谨慎使用。

你可能感兴趣的:(C)