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