在C# 中使用一段代码:
int a= 4;
a += a++;
结果a为8;但在C++中结果为9;
检查汇编代码
C# :
0 mov dword ptr [rsp+20h],4
1 mov ecx,dword ptr [rsp+20h]
2 add ecx,1 //ecx 为5
3 mov eax,dword ptr [rsp+20h] //eax为4
4 mov dword ptr [rsp+24h],eax
5 mov eax,dword ptr [rsp+20h] //eax为4
6 mov dword ptr [rsp+28h],eax
7 mov dword ptr [rsp+20h],ecx // a为5
8 mov ecx,dword ptr [rsp+28h] //ecx为4
9 mov eax,dword ptr [rsp+24h] //eax为4
10 add eax,ecx //eax为8
11 mov dword ptr [rsp+20h],eax // a为8
可以看的add指令是废弃的,对结果根本没有影响。
C++中:
0 mov dword ptr [ebp-44h],4
1 mov eax,dword ptr [ebp-44h]
2 add eax,dword ptr [ebp-44h] //eax为8
3 mov dword ptr [ebp-44h],eax //a为8
4 mov ecx,dword ptr [ebp-44h] //ecx为8
5 add ecx,1 //ecx为9
6 mov dword ptr [ebp-44h],ecx //a为9
指令的执行顺序是先add为8,然后+1,最终值为9,而且改成a += (a++);执行顺序仍然如此,感觉上好像C++中+=的优先级比++高一样。
///
修改一下
int a= 4;
a += ++a;
结果C#中a为9;C++中结果为10;
C# 汇编指令
mov dword ptr [rsp+20h],4
mov eax,dword ptr [rsp+20h]
add eax,1 //eax 为5
mov dword ptr [rsp+2Ch],eax
mov ecx,dword ptr [rsp+2Ch] //ecx为5
mov eax,dword ptr [rsp+20h] //eax为4
mov dword ptr [rsp+30h],eax
mov dword ptr [rsp+20h],ecx //a为5
mov ecx,dword ptr [rsp+30h] //ecx为4
mov eax,dword ptr [rsp+2Ch] //eax为5
add eax,ecx
mov dword ptr [rsp+20h],eax //a为9
C++汇编指令
mov dword ptr [ebp-44h],4
mov eax,dword ptr [ebp-44h]
add eax,1 //eax 为5
mov dword ptr [ebp-44h],eax //a为5
mov ecx,dword ptr [ebp-44h] //ecx 为5
add ecx,dword ptr [ebp-44h] //ecx 为10
mov dword ptr [ebp-44h],ecx //a为10
这问题到底算谁的?以后编码还是不要用这些个理解困难,又结果容易出错的代码吧!