源代碼jvm
int i = 0;spa
i = i++;excel
System.out.println(i);blog
int j=5;內存
j=++j;編譯
System.out.println(j);class
反編譯:變量
i++內存表現:im
Code:img
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
++i的內存表現:
Code:
14: iconst_5
15: istore_2
16: iinc 2, 1
19: iload_2
20: istore_2
我用excel對比了一下:
區別很明顯了:
i++在本地變量加了1以後,直接將棧頂數值推送到了本地變量,覆蓋了+1的操做,因此i++缺乏了一個將本地變量推送到棧頂的步驟
++i是本地變量加1,再將本地變量推送到棧頂,再由棧頂推送到本地變量,完美的完成了增長操做
留下一個疑惑:
int i = 0; i = i++ + i++;
System.out.print(i) ;
打印結果是1,看了反編譯結果,i++以後有一次將本地變量值推入棧頂的操做,第二次i++無效
如今的問題是不知道jvm更深刻的操做機制,也就是說不了解在什麼狀況下會觸發本地變量值推入棧頂的操做。待之後解決。