编写程序中,遇到一个++操作的问题,感觉很有意思
主要代码很简单,是这样的:
下面是Debug版本反汇编的代码:
主要代码很简单,是这样的:
int a=0,b;
b=(++a)+(++a)+(++a);
printf("%d\n",b);
按照我刚开始的想法,最后结果应该输出的是6,但是实际输出结果是7,于是就反汇编了一下。
下面是Debug版本反汇编的代码:
6: int a=0,b;
0040D748 mov dword ptr [ebp-4],0
7: b=(++a)+(++a)+(++a);
0040D74F mov eax,dword ptr [ebp-4]
0040D752 add eax,1
0040D755 mov dword ptr [ebp-4],eax
0040D758 mov ecx,dword ptr [ebp-4]
0040D75B add ecx,1
0040D75E mov dword ptr [ebp-4],ecx
0040D761 mov edx,dword ptr [ebp-4];先对参与运算的变量a做自增运算
0040D764 add edx,dword ptr [ebp-4];计算(++a)+(++a)的值存放在edx中
0040D767 mov eax,dword ptr [ebp-4];开始第三次自加操作
0040D76A add eax,1
0040D76D mov dword ptr [ebp-4],eax
0040D770 add edx,dword ptr [ebp-4];将前面加法操作的临时值和自增后的变量a相加
0040D773 mov dword ptr [ebp-8],edx;将结果赋给变量b
8: printf("%d\n",b);
0040D776 mov ecx,dword ptr [ebp-8]
0040D779 push ecx
0040D77A push offset string "%d\n" (0042201c)
0040D77F call printf (004010a0)
0040D784 add esp,8
容易出现误解地方是:先入为主的思想,先进行自增操作,然后进行加法操作;则参与运算的三个数为1,2,3,得出错误结果6。实际计算过程中,加法操作是一步步进行的,即先对前两个数进行相加,存放到临时变量里,然后和后面的第三个数进行相加,最终得到正确答案7.