最近看到这么一段代码:
代码1.cpp:
#include <iostream>
using namespace std;
int a=4;
int main()
{
a+=a++;
cout<<a<<endl;
return 0;
}
输出结果:
===============================================================
代码2.cpp
#include <iostream>
using namespace std;
int a=4;
int main()
{
a+=++a;
cout<<a<<endl;
return 0;
}
输出结果:
上面2个的结果很大不同,
a+=a++;和a+=++a;这2个表达式具体做了什么呢?下面是使用gcc编译出来的汇编代码(AT&T格式),限于篇幅,只上传2者不同的地方。
对于a+=a++而言,
对于a+=++a而言,
从2者的汇编代码,我们可以分析具体的差异性在哪里,注意红框里面的语句。
对于a+=a++来说,里面的2个movl操作导致了已经被赋值为8的a,被5所覆盖,因此a的值最终输出的时候变成了5。
对于a+=++a来说,edx和eax这2个寄存器都被a自增后的值所覆盖,也就是2个5相加,最终的结果值是10。
通过汇编的比较分析,很容易看出来这2个表达式行为上的不同之处,很小的细节。