1. 程式人生 > 實用技巧 >i=1;i+=(++i)+(i++);

i=1;i+=(++i)+(i++);

群聊看到一個有意思的問題:

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_1
        
7: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++;