近日在CSDN上看到一篇关于++a + ++a + ++a的运算讨论,回来后自己在宿舍也实践了一下,俗话说实践是检验真理的唯一标准嘛!分析的不对高手见笑了。
问题程序:debug下分析。
在VC6.0下的实现
#include <iostream>
using namespace std;
void main()
{
int a=1;
int b=++a + ++a + ++a;
cout<<b<<endl;
}
我第一次看到这个问题,觉得应该是9,但在VC6.0下DEBUG方式下调试答案是10。用release方式编译的话答案又是12,让人很纳闷。
于是F11但步跟踪,看看关键代码段。还是汇编比较清楚一点。
0040157F mov eax,dword ptr [ebp-4]
00401582 add eax,1
00401585 mov dword ptr [ebp-4],eax
00401588 mov ecx,dword ptr [ebp-4]
0040158B add ecx,1
0040158E mov dword ptr [ebp-4],ecx
00401591 mov edx,dword ptr [ebp-4]
00401594 add edx,dword ptr [ebp-4]
00401597 mov eax,dword ptr [ebp-4]
0040159A add eax,1
0040159D mov dword ptr [ebp-4],eax
004015A0 add edx,dword ptr [ebp-4]
004015A3 mov dword ptr [ebp-8],edx
从此段代码可以看出++a + ++a + ++a的执行流程是这样的:
首先++a,这时a=2
其次计算倒数第二个++a,这时a=3
然后在运算(++a)+(++a)
由于这是的a变量的内容已经变为3,所以上段代码所使用的时运算后的a,即3+3=6,而非3+2=5。
之后在计算第一个++a,这时a=4
所以最终的运算结果为b=10。
至于release方式下为什么是12我想可能是编译器的问题了,由于我不知道怎么在release下查看汇编代码,
所以我现在还不知道其中真谛。望高手赐教。