簡體   English   中英

在Java中,post增量運算符如何在return語句中起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM