從JVM角度看i++ 與++i


1.i++和++i的問題

反編譯結果為

 Code:
  0:   iconst_1
  1:   istore_1
  2:   iinc    1, 1 //這個個指令,把局部變量1,也就是i,增加1,這個指令不會導致棧的變化,i此時變成2了
  5:   iconst_1
  6:   istore_2
  7:   iinc    2, 1//這個個指令,把局部變量2,也就是j,增加1,這個指令不會導致棧的變化,j此時變成2了
  10:  return

 

可以看出,++在前在后,在這段代碼中,沒有任何不同。

我們再看另一段代碼:

反編譯結果:

  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1  //局部變量1(即i)加1變為2,注意這時棧中仍然是1,沒有改變
   6:   istore_1    //把棧頂的值放到局部變量1中,即i這時候由2變成了1
   7:   iconst_1
   8:   istore_2
   9:   iinc    2, 1 //局部變量2(即j)加1變為2,注意這時棧中仍然是1,沒有改變
   12:  iload_2    //把局部變量2(即j)的值放到棧頂,此時棧頂的值變為2
   13:  istore_2   //把棧頂的值放到局部變量2中,即j這時候真正由1變成了2
   14:  return

是否看明白了? 如果這個看明白了,那么下面的一個問題應該就是迎刃而解了:

m = m ++;這句話,java虛擬機執行時是這樣的: m的值加了1,但這是棧中的值還是0, 馬上棧中的值覆蓋了m,即m變成0,因此不管循環多少次,m都等於0。

如果改為m = ++m; 程序運行結果就是100了。。。

 

public static void main(String[] args) { int i = 0; i = i++ + ++i; System.out.println(i); }//結果輸出 2

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM