(++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同样如此~
- (++a)+=(a++)到底发生了什么
- $a=58 发生了什么?
- ResultSet.TYPE_SCROLL_SENSITIVE到底发生了什么?
- Measure(0,0)到底发生了什么
- 这几年,互联网到底发生了什么
- 网页打开过程到底发生了什么
- CLASS_A A();中,A到底代表什么?
- ++a和a++到底有什么区别?
- 震撼!这群人已经先富了,到底发生了什么?
- 不同种类的整型比较,到底发生了什么?
- .NET 3.5框架中到底发生了什么巨变?
- Linux Kernel驱逐Android:到底发生了什么
- 函数调用时,栈里到底发生了什么?
- C#参数传递时到底发生了什么
- C#参数传递时到底发生了什么(ref)
- [转载]一个浏览器访问请求到底发生了什么
- 运算符重载时到底发生了什么?【DEBUG】
- Android在横竖屏切换时到底发生了什么?
- 乔布斯在斯坦福大学2005年毕业典礼上演讲----[纪念乔布斯]
- 联想CEO杨元庆:乔布斯改变了世界
- C语言宏定义运用技巧
- 不抄不是乔布斯
- 略谈如何在对话框创建视图类画图
- (++a)+=(a++)到底发生了什么
- 为 selecrt 下拉框加上边框
- 南都周刊:别了,老兵乔布斯
- Free Mind的支持向量机(SVM)系列
- 我爱罗__baike
- 乔布斯家人声明:乔布斯平静地离去
- 用于MySql数据库的MySqlHelper.cs类,及其调用例子
- WIN32_FIND_DATA结构
- 图的邻接表和邻接矩阵