(++a)+=(a++)到底发生了什么

来源:互联网 发布:程序员java干什么的 编辑:程序博客网 时间:2024/04/26 00:16

我们可以利用VC编译器的一个选项/FAs来生成对应的汇编代码。/FAs还会在汇编代码中加入注释注明和C++代码的对应关系,十分有助于分析。在VS2008中可以这样打开/FAs:

Build代码,可以在输出目录下发现对应的.ASM文件。

通过一段代码及其汇编代码来看看计算机到底如何处理了(++a)+=(a++),c++源代码为:

#include <iostream>using namespace std;int main(){int a=4;a+=(a++);cout<<a<<endl;return 0;}
对应的.asm文件中为:

; 6    : (++a)+=(a++);moveax, DWORD PTR _a$[ebp]addeax, 1movDWORD PTR _a$[ebp], eaxmovecx, DWORD PTR _a$[ebp]addecx, DWORD PTR _a$[ebp]movDWORD PTR _a$[ebp], ecxmovedx, DWORD PTR _a$[ebp]addedx, 1movDWORD PTR _a$[ebp], edx
可以发现,计算机首先将a的值加1,然后计算a+=a(此时结果为10),最后在进行的计算++(此时为11);

也即是说,++a这样的语句是在整句话执行之前完成的,而a++这样的语句是在这句话完成之后才进行的;不妨对代码进行修改,为:

#include <iostream>using namespace std;int main(){int a=4;(++a)+=(++a);cout<<a<<endl;return 0;}
对应的汇编代码为:

; 6    : (++a)+=(++a);moveax, DWORD PTR _a$[ebp]addeax, 1movDWORD PTR _a$[ebp], eaxmovecx, DWORD PTR _a$[ebp]addecx, 1movDWORD PTR _a$[ebp], ecxmovedx, DWORD PTR _a$[ebp]addedx, DWORD PTR _a$[ebp]movDWORD PTR _a$[ebp], edx
这段代码可以证实我们的猜测。

一个更复杂一点的程序:

#include <iostream>using namespace std;int main(){int a=4;int b=3;int c=2;(++a)+=(++a)+(c++)+(++b);cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;return 0;}

对应的汇编代码为:

; 8    : (++a)+=(++a)+(c++)+(++b);moveax, DWORD PTR _a$[ebp]addeax, 1movDWORD PTR _a$[ebp], eaxmovecx, DWORD PTR _a$[ebp]addecx, 1movDWORD PTR _a$[ebp], ecxmovedx, DWORD PTR _b$[ebp]addedx, 1movDWORD PTR _b$[ebp], edxmoveax, DWORD PTR _a$[ebp]addeax, DWORD PTR _c$[ebp]addeax, DWORD PTR _b$[ebp]addeax, DWORD PTR _a$[ebp]movDWORD PTR _a$[ebp], eaxmovecx, DWORD PTR _c$[ebp]addecx, 1movDWORD PTR _c$[ebp], ecx
同样如此~

原创粉丝点击