1. 程式人生 > >java中i++ ++i位元組碼解釋

java中i++ ++i位元組碼解釋


先上問題:

int i = 0; i = i++;
int i = 0; i = ++i;
int i = 0; int j = 0; j = i+++i++;
int i = 0; int j = 0; j = i+++i+++i++;
運算後i和j的值分別是多少;
答案:

i = 0;

i = 1;

i = 2,j = 1;

i = 3,j = 3

下面乾貨,先看i++在java位元組碼中是什麼樣的。

iconst指令將常量壓入棧中,0入棧;

istore_1將棧頂int型數值存入第一個區域性變數,i=0;

iinc指定int型變數增加指定值,i自身空間自加1。

所以最終i的值為1。

再附兩個jvm指令:iload 指定的int型區域性變數進棧。iadd 棧頂兩int型數值相加,並且結果進棧。

針對開篇問題分析:

int i = 0;
i = i++;
int i = 0;
i = ++i;
int i = 0;
int j = 0;
j = i+++i++;
int i = 0;
int j = 0;
j = i+++i+++i++;
位元組碼





分析
0、stack中存入常量0
1、將棧頂int型數值存入第一個區域性變數,即i=0
2、將變數i存入stack
3、i自身空間自增,注意stack中值沒變
6、將stack中值賦值給變數i
0、stack中存入常量0
1、將棧頂int型數值存入第一個區域性變數,即i=0
2、i自身空間自增
5、將變數i存入stack,注意i已經自增,此時i=1

6、將stack中值賦值給變數i
0、stack中存入常量0
1、將棧頂int型數值存入第一個區域性變數,即i=0
2、stack中存入常量0
3、將棧頂int型數值存入第二個區域性變數,即j=0
4、將變數i存入stack,stack存入值為0
5、i自身空間自增,i=1
8、將變數i存入stack,stack存入值為1
9、i自身空間自增,i=2
12、棧頂兩個值相加 0+1=1,並將結果1進棧
13、將棧頂int型數值存入第二個區域性變數,即j=1
0~12同場景三
13、將變數i存入stack,stack存入值為2
14、i自身空間自增,i=3
17、棧頂兩個值相加 1+2=3 並將結果3進棧
18、將棧頂int數存入第二個區域性變數,即j=3
運算結果 i=0 i=1 i=2 j=1 i=3 j=3

檢視java編譯位元組碼檔案使用命令:javap -c className


轉載請註明來源【IT黑名單