编译器如何使用postfix运算符处理return语句?

Cur*_*ous 4 c# compiler-construction

有人可以解释下面的代码如何工作?

static int index = 0;
public static int GetNextIndex()
{
    return index++;
}
Run Code Online (Sandbox Code Playgroud)

我假设,因为增量操作发生在return语句之后,变量'index'将永远不会增加.

但是当使用C#编译器进行测试时,我发现'index'正在增加.

标准编译器如何处理这种情况?

Ahm*_*IEM 6

static int index = 0;
public static int GetNextIndex()
{
    return index++;
}
Run Code Online (Sandbox Code Playgroud)

相当于:

static int index = 0;
public static int GetNextIndex()
{
    int i = index;
    index = index + 1;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

因此index增加.


Dam*_*ver 6

这是编译器生成的中间语言(IL)(VS2013RC/.NET 4.5.1RC):

.method public hidebysig static int32 GetNextIndex() cil managed
{
    .maxstack 8
    L_0000: ldsfld int32 ConsoleApplication4.Program::index
    L_0005: dup 
    L_0006: ldc.i4.1 
    L_0007: add 
    L_0008: stsfld int32 ConsoleApplication4.Program::index
    L_000d: ret 
}
Run Code Online (Sandbox Code Playgroud)

那么,那是做什么的?假设index它在调用之前具有值6.

    L_0000: ldsfld int32 ConsoleApplication4.Program::index
Run Code Online (Sandbox Code Playgroud)

将值加载index到评估堆栈 - 堆栈包含6.

    L_0005: dup
Run Code Online (Sandbox Code Playgroud)

复制堆栈顶部的值 - 堆栈包含 6, 6

    L_0006: ldc.i4.1
Run Code Online (Sandbox Code Playgroud)

将值加载1到堆栈 - 堆栈包含6, 6, 1

    L_0007: add 
Run Code Online (Sandbox Code Playgroud)

在堆栈上添加前两个值,并将结果放回堆栈.堆栈包含6, 7

    L_0008: stsfld int32 ConsoleApplication4.Program::index
Run Code Online (Sandbox Code Playgroud)

将堆栈的最高值存储到index.index现在等于7,堆栈包含6.

    L_000d: ret 
Run Code Online (Sandbox Code Playgroud)

将stack(6)的最高值作为返回值.