前几天,中午去吃饭的时候,“指导”问了一个C++的问题:
- int i = 0;
- i = i ++;
- printf("%d/n", i);
输出是0还是1呢?
当时想了一下觉得应该是0,我的理解是“++”的优先级高于赋值,i = i ++;i的值0先被读出到寄存器(如R中),然后对i进行自加操作(此时i为1),最后对用寄存器R对i赋值,自加的结果被最后赋值的结果覆盖,所以结果应该为0。
回到宿舍,用VC++6.0小试一下,出乎意料,输出居然是“1”!进入汇编调试看一下汇编代码(如图-1所示),“++”操作竟在赋值之后进行。
图-1
后来,又在DevC++5上实验得到的结果是“0”!!,查看汇编代码(如图-2所示),跟我刚开始的想法一致的。
图-2
DevC++属于GCC家族的,本以为在g++(4.1.2版本)里结果应该也是“0”,结果又一次出乎意料,g++输出是“1”!!!看了一下g++的编译结果(如图-3所示)。
图-3
按照一个师兄的说法,C++标准里是说,后置“++”操作是在整条语句执行完之后才自加的。
那DevC++的编译结果该怎么理解,后面尝试了一下:
- int i = 0;
- i = 2 + i++;
- printf("%d/n", i); // DevC++5、VC++6.0和g++输出都是3
上述代码的DevC++5的编译结果如图-4所示,看来DevC++5只是在“i = i++;”的情况下,自加在赋值之前完成。
图-4
最后,在java里,用sun公司提供的JDK1.6.0_06对上述两段代码进行了测试结果分别是0和2。应该是按运算符优先级,先自加,再赋值的。