学习C++同时又在使用C#的朋友注意了,下面简单语句在C#与C++中结果完全不同。
C#
-------------------------------------
int i = 10;
int val = (i++) + i++;
// val = 21, i = 12;
C++
-------------------------------------
int i = 10;
int val = (i++) + i++;
// val = 20, i = 12;
我们下看一下反汇编代码,两个编译器是怎么做的
C#
-----------------------------------------------
0000000e mov dword ptr [ebp-0Ch],0 ;给变量 val 赋0值
00000015 mov esi,0Ah ; i = 10; ==> ESI
int val = i++ + i++;
0000001a mov ebx,esi ;ESI = 10; EBX <= ESI
0000001c inc esi ;ESI = 11;
0000001d mov edi,esi ;EDI <= ESI, EDI == 11
0000001f inc esi ;ESI = 12
00000020 add ebx,edi ; EBX = EDI + EBX = 11 + 10 == 21
00000022 mov dword ptr [ebp-0Ch],ebx ; val = 21
C++
----------------------------------------------
int i = 10;
00411A1E mov dword ptr [i],0Ah
int val = i++ + i++;
00411A25 mov eax,dword ptr [i]
00411A28 add eax,dword ptr [i] ; 直接计算 i + i
00411A2B mov dword ptr [val],eax
00411A2E mov ecx,dword ptr [i]
00411A31 add ecx,1 ; 计算 i = i + 1
00411A34 mov dword ptr [i],ecx
00411A37 mov edx,dword ptr [i]
00411A3A add edx,1 ;又计算i = i + 1
00411A3D mov dword ptr [i],edx
通过上面汇编片断看出,
C#编译器对i++理解为: 不论是否在一条语句里,i的值被取完之后,都被加1.
C++编译器对i++理解为:只有在一条完全语句执行完毕后,才进行i = i + 1运算。