1. 程式人生 > 其它 >i=i++問題解析

i=i++問題解析

技術標籤:JAVA題庫練習分析

1.在看面試題的時候看到++i和i++的題目,我們都知道他們是加操作先後的差別,但是仔細想想,我們是否真的懂了?

下面就有個問題:

下面程式碼的執行結果為什麼是這樣?

 public static void main(String[] args) {
        int i=10;
        int n=15;
        i=i++;
        System.out.println(i);

    }

在這裡插入圖片描述
想要弄清楚程式的輸出結果為什麼為10,我們要對程式碼是怎樣的執行進行解析:
首先,主方法棧幀初始化記憶體,然後給i賦值10,給n賦值15

然後進行i=i++;的操作,重點就是這裡我們都知道i=i++;是個複合操作,我們先試著將它分開,有兩種情況:
1)i=i; i=i+1;
2) i=i+1; i=i;
這時候就有同學有疑惑了,無論是那種情況,i最後的值都應該是11啊,怎麼會輸出10呢?

其實,我們看看位元組碼就知道了:
上面程式碼編譯後的位元組碼如下:

 public static void main(String[] args) {
        int i = 10;
        int n = true;
        byte var10000 = i;
        int var3 = i + 1;
        i =
var10000; System.out.println(i); }

我們可以看到它裡面使用了var10000來作為一箇中間變數儲存i開始的值,最後賦給i的還是是中間變數的值,它相當於一個快取吧。 我們都知道CPU每次運算後的值不會直接寫到主存中,而是先存放再Cache中再寫入主存,這裡類似,每條語句的運算結果其實都不會直接賦給那個變數,而是先通過一種中間快取機制存放,然後賦給相應的變數。

類似的,i=++i;的問題也就一目瞭然了