天天看點

由i=i++ i=++i 寫起

今天有網友問起 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.   其實是錯誤的。 

我們下面先看下反編譯後的檔案(紅框内是不同部分)

由i=i++ i=++i 寫起

我們以左圖為例來進行分析(從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