运行代码的反汇编:
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。
在调试时使用它:
Debug (menu) -> Windows (submenu) -> Disassembly
那么 postfix++ 发生了什么?
后缀++告诉我们想在评估之后增加操作数的值……每个人都知道……有点混淆的是“评估之后”的含义。
那么“评估后”是什么意思:
- 必须影响同一行代码中操作数的其他用法:
a = i++ + i
第二个 i 受增量影响
Func(i++, i)
第二个我受到影响
- 同一行上的其他用法尊重短路运算符,例如
||
and &&
:
(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)
- 存储 step 1 + i 的值(即 0 + 1)
- 将第 3 步的值赋给 i(i 变为 1)