今天有網友問起 i++ ++i的問題 因為好久沒有接觸了 也不是特别了解其中的緣由 隻記得當時老師教的時候 說讓我們記住 "i++ 先使用 在自增 ++i 先自增在使用" 這句話
為了搞清緣由 反編譯了下生成的class 檔案
寫了2個java 檔案 分别命名為a.java b.java c.java d.java
c.java
public class c{
public static void main(String args[]) {
int i = 0;
i = i++;
System.out.println(i);
}
}
d.java
public class d{
public static void main(String args[]) {
int i = 0;
i = ++i;
System.out.println(i);
}
}
咋一看 大多數人都以為最後的結果都是1. 其實是錯誤的。
我們下面先看下反編譯後的檔案(紅框内是不同部分)

我們以左圖為例來進行分析(從main方法開始)
0: 将常數0插入棧 棧内容【0】
1: 将棧頂元素彈出 存入位置為1 的局部變量 (即i=0) 棧内容【】
2: 從位置為1 的局部變量取出元素 壓人棧 棧内容【0】
3: 位置為1 的局部變量+1 此時i=1 棧内容【0】
6: 将棧頂元素彈出 存入位置為1 的局部變量 這時i的值又為0了 棧内容【】
10: 從位置為1 的局部變量取出元素 壓人棧 棧内容【0】
11: 調用列印方法 輸出棧頂内容
是以 最後結果為0
通過上面的對位元組碼的分析 可以得出
i=i++; 是先将i的值壓人棧頂 能後在+1(此時i=1) 在能後将棧頂的值賦給i 雖能+1了 但是最後又被棧頂的值覆寫了 是以 還是0
這行代碼可以了解為: int tmp = i; i++; i=tmp;
而i=++i 就不一樣了 他是先+1 能後在入棧 在出棧。(上面的加粗标紅部分)
是以在i 同為0 的情況下 最後的結果是
i=i++; ==> 0
i=++i; ==> 1