![](/img/trans.png)
[英]Why is post increment operator in a return statement act different from expected in Eclipse?
[英]In Java, how does a post increment operator act in a return statement?
給定以下代碼,ixAdd會執行您期望的操作,即在增量之前返回ix的值,但在離開函數之前增加類成員嗎?
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++;
}
}
當程序離開函數的堆棧幀(或Java中的任何內容)時,我不太確定post / pre increment的通常規則是否也適用於return語句。
關鍵部分是在計算表達式后立即發生后遞增/遞減。 它不僅在返回發生之前發生 - 它發生在任何后續表達式被評估之前。 例如,假設您寫道:
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++ + giveMeZero();
}
public int giveMeZero()
{
System.out.println(_ix);
return 0;
}
}
這也會打印出遞增的結果,因為增量發生在giveMeZero()
之前。
那么,讓我們看一下字節碼(使用javap -c <classname>
自己看看):
Compiled from "PostIncTest.java"
class myCounter extends java.lang.Object{
myCounter();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2; //Field _ix:I
9: return
public int ixAdd();
Code:
0: aload_0
1: dup
2: getfield #2; //Field _ix:I
5: dup_x1
6: iconst_1
7: iadd
8: putfield #2; //Field _ix:I
11: ireturn
}
如您所見, ixAdd()
指令6和7處理返回前的增量。 因此,正如我們所期望的那樣,遞減運算符確實在return語句中使用時有效。 但是請注意,在這兩個出現之前有一個dup
指令; 遞增的值(當然)不會反映在返回值中。
是的,即使在退貨聲明中,通常的規則也適用於后期增量。 基本上,它在低級別執行的操作是將返回值存儲到寄存器中,然后遞增類成員,然后從方法返回。
您可以在稍后回答顯示字節代碼的問題時看到這一點。
是的,它確實。
但是不要這樣做,在表情中有副作用是不好的風格。
它確實在遞增之前返回值,然后遞增_ix。 因此,第一次在myCounter實例上調用方法ixAdd時,它將返回1,第二次返回2,依此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.