[英]Difference in implementation of x = x + 1 and x++
我的教授最近說過,雖然x = x + 1
和x++
顯然會給出相同的結果,但它們在JVM中的實現方式卻有所不同。 這是什么意思? 編譯器不是這樣的:嘿,我看到x++
所以我將它切換到x = x + 1
並繼續?
我懷疑在效率方面有什么不同,但如果在這些情況下裝配會有所不同,我會感到驚訝......
我的教授最近說過,雖然x = x + 1和x ++顯然會給出相同的結果
我猜你的教授或許意味着- 值x
后, x = x + 1
和x++
將是相同的 。 只是為了重新表達,因為它似乎在解釋問題時產生了混亂。
好吧,雖然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.