编译器如何处理带有后缀运算符的返回语句

本文关键字:后缀 运算符 语句 返回 何处理 处理 编译器 | 更新日期: 2023-09-27 18:33:24

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

static int index = 0;
public static int GetNextIndex()
{
    return index++;
}

我假设,由于增量操作发生在 return 语句之后,变量"index"永远不会递增。

但是当使用 C# 编译器进行测试时,我观察到"索引"正在增加。

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

编译器如何处理带有后缀运算符的返回语句

这是编译器生成的中间语言 (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 
}

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

    L_0000: ldsfld int32 ConsoleApplication4.Program::index

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

    L_0005: dup

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

    L_0006: ldc.i4.1

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

    L_0007: add 

将堆栈上的前两个值相加,然后将结果放回堆栈上。 堆栈包含6, 7

    L_0008: stsfld int32 ConsoleApplication4.Program::index

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

    L_000d: ret 

将堆栈上的顶值 ( 6 ) 作为返回值。

static int index = 0;
public static int GetNextIndex()
{
    return index++;
}

相当于:

static int index = 0;
public static int GetNextIndex()
{
    int i = index;
    index = index + 1;
    return i;
}

因此index递增。