C/C++中自增自减运算符相信是不少人的一个困扰,这个问题也一直困扰着我,今天再次翻开书本来看了看,有了些新的体会,所以在这里记录下来,同时也与那些像我一样被困扰的人分享,编程大牛可以绕道了,或者有什么不对的地方请大牛们指正。
以++为例,如下程序输出结果是什么
int a=0,j=1;
a=j++;
cout<<a<<j<<endl;
估计有人会说a=2,j=2;恭喜你答错了;
有人会说a=1; j=2,这是正确的结果,但是答对的人不一定完全知道为什么,可能只是记得,遇到++的时候,先赋值,再自增。
其实并不是这样的,这种想法是错误的。我们去查每一本C/C++工具书,都会找到:++操作符具有右结合性,++优先级高于=;以此看来应该是先做++,在做赋值,也就是结果应该是 a=2,j=2; 但实际并不是,这不是自相矛盾吗?为什么会有这样的结果呢?
我们去查C++Primer,自增自减运算符章节中,有个灰色背景的建议,其中写道:“后置操作符必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。”因此我们就明白了为什么会是这个结果,++确实是在先先于赋值操作符 = 计算的,但是j++的返回值却是未加1之前的值。