int i=3; i=i++;i等於幾.偶然看到的面試題

第一眼看到這種題,心裏mmp,這麼簡單也放出來.看了答案,答錯了,心中無數的cnm 神獸略過.

答案爲3.想這麼簡單的題,又找不到原因,我一般是直接用工具把class文件解析字節碼.以下爲解析的代碼:

 0 iconst_3 將常量 3 push 到棧頂
 1 istore_1 從棧頂pop 存儲到局部變量表 索引爲1
 2 iload_1 讀取在局部變量表索引爲1的變量,並push 棧頂中 ,這時棧頂爲3
 3 iinc 1 by 1 這個操作是在局部變量表中進行的,並沒有push 到棧頂.這時索引爲1的局部變量爲4
 6 istore_1  從棧頂pop 存儲到局部變量表 索引爲1.棧頂的值爲3,覆蓋掉索引爲1的局部變量的值
 7 getstatic #2 <java/lang/System.out>
10 iload_1 讀取在局部變量表索引爲1的變量,並push 棧頂中 ,這時棧頂爲3
11 invokevirtual #3 <java/io/PrintStream.println> 這時會打印出3
14 return

如果i=i++改成 i=++i; 會成什麼樣子:
答案爲4:

0 iconst_3
 1 istore_1
 2 iinc 1 by 1
 5 iload_1
 6 istore_1
 7 getstatic #2 <java/lang/System.out>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println>
14 return

這個是不用繼續解釋了,就25 調換位置跟第一個就一樣了.這也就說明前綴++ ,是先自加後賦值,後綴++,先賦值後自加這一也是造成i爲3的的原因(賦值push 到棧頂,自加後又從棧頂賦值到局部,不明白就看第一個解釋)

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