关于a=4,++a+=a++最后结果的研究

来源:互联网 发布:什么是淘宝最低价 编辑:程序博客网 时间:2024/05/16 17:03

a=4,b=0,编译环境vc++2008
++a+=a++  

结果:a=11

汇编:

mov eax, DWORD PTR _a$[ebp]

add eax, 1

mov DWORD PTR _a$[ebp], eax

mov ecx, DWORD PTR _a$[ebp]

add ecx, DWORD PTR _a$[ebp]

mov DWORD PTR _a$[ebp], ecx
mov edx, DWORD PTR _a$[ebp]

add edx, 1 mov DWORD PTR _a$[ebp], edx

猜测:先++a +=a,最后a++  --> 先++a,再+=   -->先++a再+=,最后a++
问题:i.++a和a++能否当左值? ii.++a和a++返回的结果是什么? iii.++a 、+=及a++优先级顺序? ix.整个程序执行顺序? 
查msdn知:

i.a++(后置++)为一元运算符,先返回操作数,返回值为操作数的值,然后操作数的值加1,a++不能当左值。

ii.++a(前置++)为一元运算符,先在操作数的值上加1个单位,再返回操作数,++a返回值是左值,类型与操作数相同,操作数必须是非const的integral,floating,or pointer type的左值

iii.优先级a++ > ++a > +=
验证:
1.++b+=a

结果:b=5,a=4

汇编:

mov eax, DWORD PTR _b$[ebp]

add eax, 1

mov DWORD PTR _b$[ebp], eax
mov ecx, DWORD PTR _b$[ebp]

add ecx, DWORD PTR _a$[ebp]

mov DWORD PTR _b$[ebp], ecx

分析:先++b,再+=结论:++b比+=优先级高
2.b+=a++ 

结果:b=4 a=5

汇编:

mov eax, DWORD PTR _b$[ebp]

add eax, DWORD PTR _a$[ebp]

mov DWORD PTR _b$[ebp], eax
mov ecx, DWORD PTR _a$[ebp]

add ecx, 1

mov DWORD PTR _a$[ebp], ecx

分析:a++先返回a去先做b+=a,再a++
3.++b+=a++

结果: b=5 a=5

汇编:

mov eax, DWORD PTR _b$[ebp]

add eax, 1

mov DWORD PTR _b$[ebp], eax
mov ecx, DWORD PTR _b$[ebp]

add ecx, DWORD PTR _a$[ebp]

mov DWORD PTR _b$[ebp], ecx
mov edx, DWORD PTR _a$[ebp]

add edx, 1 mov DWORD PTR _a$[ebp], edx

分析:a++先返回a做  ++b+=a ,再++b,然后+=,最后a++
4.++a+=a 

结果:a=10

汇编:

mov eax, DWORD PTR _a$[ebp]

add eax, 1

mov DWORD PTR _a$[ebp], eax
mov ecx, DWORD PTR _a$[ebp]

add ecx, DWORD PTR _a$[ebp]

mov DWORD PTR _a$[ebp], ecx

分析:先++a,再+=
5.a+=a++ 

结果:a=9

汇编:

mov eax, DWORD PTR _a$[ebp]

add eax, DWORD PTR _a$[ebp]

mov DWORD PTR _a$[ebp], eax
mov ecx, DWORD PTR _a$[ebp]

add ecx, 1

mov DWORD PTR _a$[ebp], ecx

分析:a++先返回a做a+=a,再a++
结论:++a+=a++ 

整个程序在vc++2008中的运行顺序是:a++先返回a做++a+=a再++a再+=最后a++最后a的值为11.

原创粉丝点击