int i =0;i=i++; 看起来结果好像是1;实际却是0;通过IL 反汇编程序查看生成的msil来了解执行细节。
在此之前先了解几个内容:
程序在运行时内存中分成了多个区域,其中包括
evaluation stack : 可以理解为用来保存表达式的操作数的临时容器 ,线程独立。[MS-VGSFF]: Evaluation Stack | Microsoft Docs 评估堆栈是一个 堆栈 ,因此是一个后进/先出 (LIFO) 工具。当函数启动时,评估堆栈为空。当函数运行时,项目从评估堆栈中被推送和弹出。在函数退出之前,除了返回值之外,评估堆栈必须再次为空。jmp 和 tail指令是此规则的 例外。如果评估堆栈在退出时不为空,则运行时会引发 InvalidProgramException 异常。
call stack:调用栈,方法执行时保存数据的容器。每个方法执行时都会在该区域创建一个线程栈,不同的线程之间相互隔离。
local variable list: 局部变量区域,归属于call stack的线程栈内。
Managed Heap:托管堆,由GC负责回收,线程之间共享。
代码异常简单:
public void Test()
{
int i = 0;
i =i++;
Console.WriteLine(i);
}
以下是中间码:
.maxstack 3
.locals init (int32 V_0)
IL_0000: nop 空指令;
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: dup
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stloc.0
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: call void [System.Console]System.Console::WriteLine(int32)
IL_000f: nop 空指令
IL_0010: ret