i++
如果i=1
那麼i++
不就是2嘛,這麼簡單小學生都會!
那i=i++
呢?
我們不妨做個試驗:
public static void main(String[] args) {
int i = 1;
i=i++;
System.out.println(i);
}
結果還是1,這也應該有很多人都知道,可是爲什麼會是1呢?又有多少人能解釋得通?我也是今天突然想到這個問題,決定研究一下爲什麼i=i++
的結果是1。
看指令
所以我決定看一下字節碼javap -v ClassName
,我從編譯的字節碼中截取了實際計算i++
這部分的指令,//
後面的字是我查閱指令後加的
...
0: iconst_1 // int 值入棧
1: istore_1 //將棧頂int類型值保存到局部變量1中。
2: iload_1 //從局部變量1中裝載int類型值入棧。
3: iinc 1, 1 //將整數值constbyte加到indexbyte指定的int類型的局部變量中
6: istore_1 //將棧頂int類型值保存到局部變量1中。
...
看到指令後就明白了:
- 1 先入棧,然後彈出棧頂的1保存到局部變量i中,這就是代碼第一句
int i = 1
- 將局部變量i的int值壓入棧
- 將常量1加到索引爲1的局部變量
i
中,此時i=2
,棧中還有一個int值1
- 彈出棧頂的int值
1
保存到局部變量i
此時i=1
這就是i = i++
整個經歷的過程,如果我們讓i
去接收i++
的結果,那麼i
的值就會是1