i=1;i+=(++i)+(i++);
阿新 • • 發佈:2020-12-04
群聊看到一個有意思的問題:
i=1;
i+=(++i)+(i++);
輸出:
i=5
然後結果 i=5 怎麼得出來的呢?
通過反編譯獲取位元組碼,得到主要程式碼如下:
public static void main(java.lang.String[]); Code: 0:iconst_1 // 直接取常量(整數 1),壓入棧中 1:istore_1 // 彈棧,並存入區域性變數(Slot 0) 2:iload_1 // 從區域性變數(Slot 0)取值,壓入棧中 3:iinc 1,1 // 對區域性變數(Slot 0)進行自增(+1)操作,與棧無關 6:iload_17:iload_1 8:iinc 1,1 11:iadd 12:iadd 13:istore_1 14:getstatic 17:iload_1 18:invokevirtual 21:return }
通過位元組碼可以得知,首先執行 i=1,將常量放入棧中,然後彈棧,將常量存入區域性變數slot 0中,又將區域性變數slot 0中值壓入棧中,此時,棧中只有一個值 1。
接下來對區域性變數slot 0中的常量1進行自增,slot 0中值變為2;執行iload_1 ,對區域性變數slot 0取值並壓入棧中,然後又執行了一次iload_1,此時棧中存有 1,2,2三個值。
再一次執行iinc的時候,只是對區域性變數slot 0中值進行了操作,區域性變數slot 0 中的值 2+1=3,但這個值並沒有壓入棧中。
接下來執行了兩次iadd,分別對棧中最接近棧頂的兩個值進行了求和,並存入棧中。
2+2=4 4+1=5
所以最終得出結果為5.
觀察原表示式,
i+=(++i)+(i++); //實際等價於執行 a = i; i++; b = a+i+i; i++;