簡體   English   中英

x = x + 1和x ++的實現差異

[英]Difference in implementation of x = x + 1 and x++

我的教授最近說過,雖然x = x + 1x++顯然會給出相同的結果,但它們在JVM中的實現方式卻有所不同。 這是什么意思? 編譯器不是這樣的:嘿,我看到x++所以我將它切換到x = x + 1並繼續?

我懷疑在效率方面有什么不同,但如果在這些情況下裝配會有所不同,我會感到驚訝......

我的教授最近說過,雖然x = x + 1和x ++顯然會給出相同的結果

我猜你的教授或許意味着- x后, x = x + 1x++將是相同的 只是為了重新表達,因為它似乎在解釋問題時產生了混亂。

好吧,雖然x的值相同,但它們是不同的運算符,並且在字節碼中使用不同的JVM指令。 x + 1使用iadd指令,而x++使用iinc指令。 雖然這是依賴於編譯器的。 編譯器可以為特定操作使用不同的指令集。 我已經針對javac編譯器進行了檢查。

對於eclipse編譯器,來自@Holger的以下注釋之一:

我只是用我的eclipse測試它,它為兩個表達式生成了iinc 所以我發現一個編譯器生成相同的指令

您可以使用javap命令檢查字節代碼。 我們考慮以下課程:

class Demo {
    public static void main(String[] args) {
        int x = 5;

        x = x + 1;
        System.out.println(x);

        x++;
        System.out.println(x);
    }
} 

編譯上面的源文件,然后運行以下命令:

javap -c Demo

代碼將被編譯為以下字節碼(僅顯示main方法):

 public static void main(java.lang.String[]);
   Code:
      0: iconst_5
      1: istore_1
      2: iload_1
      3: iconst_1
      4: iadd
      5: istore_1
      6: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      9: iload_1
     10: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     13: iinc          1, 1
     16: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
     19: iload_1
     20: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     23: return

兩個表達式x++x=x+1不會給出相同的結果,你的教授是錯的(或者你把它與++x混淆了,這又是不同的)。 看到這個

void notthesame() {
    int i = 0;
    System.out.println(i = i + 1);
    i = 0;
    System.out.println(i++);
    System.out.println("See?");
}

因此,字節碼的問題毫無意義,因為2個不同的計算不能具有相同的字節碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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