Java 終於明白i++的值是什麼了

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章