C语言中自增符号

自增自减运算符:http://baike.baidu.com/link?url=lvWpE-kIzYhqu2nxrHCQ0bQxREmqVDyt22Q4WeNskSorlz-xT-nP60ucg5MfZdJmYmvkqrJsgNKqM3TCaHEB0DLAZ1zdVWTVoiDTo40bP7BjALJQHiBtldpwD2bY9eex3d3NuXPkAXRQuSvSGOY2EK

1.自增运算符 ++ 使操作数的值加1,其操作数必须为可变左值(可简单地理解为变量)

2. i++的理解应该是执行完整个表达式的其他操作后,然后才自增;  ++j是先自增然后再参加其它运算.

3.i++是提供i的副本(右值)参加后面运算后,i变量(左值)再自加1;++j是自身变量(左值)先自增后并且参加后续运算;

参考:

看到这个怪异的表达式,你的第一感觉是什么结果呢?你或许会这样组合:(a++)+(++b),或者这样组合:((a++)++)+b。哪一个表达式正确呢?C语言的操作符优先级是“++”高于“+”,所以第二个组合是正确的。那结果是什么呢?还是先编译下看看吧:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main()  
  4. {  
  5. int a,b,c;  
  6. a=b=1;  
  7. printf("a+++++b=%d\n",a+++++b);  
  8. return 0;  
  9. }  
[plain]  view plain  copy
  1. $ gcc -o t test.c  
  2. test.c: In function 'main':  
  3. test.c:7:26: error: lvalue required as increment operand  
提示“左值需要操作数”。左值?左值就是可以在"="左边,能被赋予值的东西;右值则是在"="右边,可以赋值给别人的东西。所以左值必须是有内存空间的东西;而右值则既可以是变量,也可是常量和某种表达式,只要能提供一个值即可。这里的左值只有第二个“++”的左值了。说明“a++”不是一个操作数。

“a++”不能作为左值的原因是什么呢?表达式“a++”是先返回a的值(value,本例中也就是1),再对a的引用加1 。所以本例中“(a++)++”实际上等价于“1++”,这个肯定是不合法的啊。怎么让这个表达式修改为合法呢?这样试下:a+++(++b)。结果为3 。(++a能否作为左值有待研究,gcc编译器是不可以,但见有网友说可以,查清楚后再发布。)

自增操作符的易错点:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main()  
  4. {  
  5. int a,b,c,d;  
  6. a=b=c=d=1;  
  7. printf("a++ + a++=%d and a=%d\n",a++ + a++,a);  
  8. printf("++b + ++b=%d and b=%d\n",++b + ++b,b);  
  9. printf("c++ + c++ + c++=%d and c=%d\n",c++ + c++ + c++,c);  
  10. printf("++d + ++d + ++d=%d and d=%d\n",++d + ++d + ++d,d);  
  11. return 0;  
  12. }  

结果:

[plain]  view plain  copy
  1. $ gcc -o t2 test2.c  
  2. $ t2  
  3. a++ + a++=2 and a=3  
  4. ++b + ++b=6 and b=3  
  5. c++ + c++ + c++=3 and c=4  
  6. ++d + ++d + ++d=10 and d=4  

理解:后置自增操作符是先进行赋值操作再进行两次自增,而前置自增操作符刚好是相反(这样理解似乎也不是太恰当,看最后一个例子)。最后一个例子怎么理解?表达式除了考虑++优先级问题外还要考虑“+”运算符的左结合性,表达式先进行(++d + ++d),然后再和后面的++d求和,即3+3+4 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值