有人可以解釋以下代碼的工作原理嗎?編譯器如何用postfix操作符處理返回語句?
static int index = 0;
public static int GetNextIndex()
{
return index++;
}
我認爲,由於增量操作發生在return語句之後,變量'index'永遠不會增加。
但是,當用C#編譯器測試時,我觀察到'索引'正在增加。
標準編譯器如何處理這種情況?
有人可以解釋以下代碼的工作原理嗎?編譯器如何用postfix操作符處理返回語句?
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
遞增。
什麼讓你覺得增量發生在return語句之後?增量發生在獲得索引的值後,*在return語句中使用* –
因爲它是後綴運算符。 – Curious
@Fadi閱讀此解答由Eric Lippert解釋pre/postfix的機制http://stackoverflow.com/a/3346729/860585 – Rotem