++a + ++a + ++a运算问题

近日在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下查看汇编代码,

所以我现在还不知道其中真谛。望高手赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值