i=i++問題解析
阿新 • • 發佈:2020-12-12
技術標籤: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
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;的問題也就一目瞭然了