第一眼看到這種題,心裏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 到棧頂,自加後又從棧頂賦值到局部,不明白就看第一個解釋)