自增自减运算符: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语言的操作符优先级是“++”高于“+”,所以第二个组合是正确的。那结果是什么呢?还是先编译下看看吧:
提示“左值需要操作数”。左值?左值就是可以在"="左边,能被赋予值的东西;右值则是在"="右边,可以赋值给别人的东西。所以左值必须是有内存空间的东西;而右值则既可以是变量,也可是常量和某种表达式,只要能提供一个值即可。这里的左值只有第二个“++”的左值了。说明“a++”不是一个操作数。
“a++”不能作为左值的原因是什么呢?表达式“a++”是先返回a的值(value,本例中也就是1),再对a的引用加1 。所以本例中“(a++)++”实际上等价于“1++”,这个肯定是不合法的啊。怎么让这个表达式修改为合法呢?这样试下:a+++(++b)。结果为3 。(++a能否作为左值有待研究,gcc编译器是不可以,但见有网友说可以,查清楚后再发布。)
自增操作符的易错点:
结果:
理解:后置自增操作符是先进行赋值操作再进行两次自增,而前置自增操作符刚好是相反(这样理解似乎也不是太恰当,看最后一个例子)。最后一个例子怎么理解?表达式除了考虑++优先级问题外还要考虑“+”运算符的左结合性,表达式先进行(++d + ++d),然后再和后面的++d求和,即3+3+4 。