运行代码的反汇编:
int i = 0;
xor edx, edx
mov dword ptr i, edx // set i = 0
i += i++;
mov eax, dword ptr i // set eax = i (=0)
mov dword ptr tempVar1, eax // set tempVar1 = eax (=0)
mov eax, dword ptr i // set eax = 0 ( again... why??? =\ )
mov dword ptr tempVar2, eax // set tempVar2 = eax (=0)
inc dword ptr i // set i = i+1 (=1)
mov eax, dword ptr tempVar1 // set eax = tempVar1 (=0)
add eax, dword ptr tempVar2 // set eax = eax+tempVar2 (=0)
mov dword ptr i, eax // set i = eax (=0)
等价的代码
它编译成与下面代码相同的代码:
int i, tempVar1, tempVar2;
i = 0;
tempVar1 = i; // created due to postfix ++ operator
tempVar2 = i; // created due to += operator
++i;
i = tempVar1 + tempVar2;
分解第二个代码(只是为了证明它们是相同的)
int i, tempVar1, tempVar2;
i = 0;
xor edx, edx
mov dword ptr i, edx
tempVar1 = i; // created due to postfix ++ operator
mov eax, dword ptr i
mov dword ptr tempVar1, eax
tempVar2 = i; // created due to += operator
mov eax, dword ptr i
mov dword ptr tempVar2, eax
++i;
inc dword ptr i
i = tempVar1 + tempVar2;
mov eax, dword ptr tempVar1
add eax, dword ptr tempVar2
mov dword ptr i, eax
打开拆卸窗口
大多数人不知道,甚至不记得,他们可以使用Visual Studio反汇编窗口看到最终的内存汇编代码。它显示的是正在执行的机器代码,而不是CIL。
在调试时使用这个:
调试(菜单)-> Windows(子菜单)->拆卸
那么后缀++发生了什么?
后缀++表示我们想在求值…之后增加操作数的值。每个人都知道……让人有点困惑的是“评估之后”的含义。
那么“评估之后”是什么意思呢?
操作数在同一行代码上的其他用法必须受到影响:
A = i++ + i,第二个i受增量影响
Func(i++, i)第二个i受到影响
在同一行中的其他用法是关于短路运算符的,如||和&&:
(false && i++ != i) || i == 0第三个i不受i++的影响,因为它没有被计算
那么i+ = i++;是什么意思呢?
这和i = i+ i++;
求值顺序为:
存储i + i(即0 + 0)
增量i (i变成1)
将步骤1的值赋给i (i变为0)
并不是说增量被丢弃了。
i = i++ + i;是什么意思?
这与前面的例子不同。第三个i受到增量的影响。
求值顺序为:
存储i(那是0)
增量i (i变成1)
存储步骤1 + i的值(即0 + 1)
将第3步的值赋给i (i变成1)