反汇编运行代码:
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 Disassembly窗口看到最终的内存中汇编代码。它显示正在执行的机器代码,而不是CIL。
在调试时使用它:
Debug (menu) -> Windows (submenu) -> Disassembly
那么postfix ++会发生什么呢?
postfix ++告诉我们,我们希望在求值后增加操作数的值...大家都知道...有点困惑的是“求值后”的含义。
那么“评估后”是什么意思:
- 必须影响同一行代码上操作数的其他用法:
a = i++ + i
第二个我受增量影响
Func(i++, i)
我第二次受到影响
- 同一条线上的其他用法尊重短路运算符,例如
||
和&&
:
(false && i++ != i) || i == 0
第三个我不受i ++的影响,因为未评估
那是什么意思i += i++;
呢?
与...相同 i = i + i++;
评估顺序为:
- 存储i + i(即0 + 0)
- 增量i(我变为1)
- 将步骤1的值分配给i(i变为0)
并不是说增量被丢弃了。
是什么意思i = i++ + i;
?
这与前面的示例不同。第三项i
受增量影响。
评估顺序为:
- 储存我(即0)
- 增量i(我变为1)
- 存储步骤1 + i的值(即0 + 1)
- 将步骤3的值分配给i(i变为1)