编译好反汇编,运算完了下个断点。
a=3;
000D13BE C7 45 F8 03 00 00 00 mov dword ptr [a],3
b=(a++)+(++a)+(a++);
000D13C5 8B 45 F8 mov eax,dword ptr [a]
000D13C8 83 C0 01 add eax,1
000D13CB 89 45 F8 mov dword ptr [a],eax
000D13CE 8B 4D F8 mov ecx,dword ptr [a]
000D13D1 03 4D F8 add ecx,dword ptr [a]
000D13D4 03 4D F8 add ecx,dword ptr [a]
000D13D7 89 4D EC mov dword ptr [b],ecx
000D13DA 8B 55 F8 mov edx,dword ptr [a]
000D13DD 83 C2 01 add edx,1
000D13E0 89 55 F8 mov dword ptr [a],edx
000D13E3 8B 45 F8 mov eax,dword ptr [a]
000D13E6 83 C0 01 add eax,1
000D13E9 89 45 F8 mov dword ptr [a],eax
可以看到,首先给a赋值为3。
随后送进寄存器+1再送回来
然后:传给ecx,并两次加上自己,最后赋值给b(相当于b = a*3),最后又用老办法给a+1两次
最后b = (a+1)*3 =12
a = a+1+1+1 = 6
//===================================================================================
同时可以看到,这样效率低下。
a+1可以直接inc DWord ptr[a]
而不是送进寄存器加完再送出来