i++和++i詳解(Java中間緩存問題)

i++和++i詳解(中間緩存問題)

我們都知道i++和++i的區別在於i++是先用i值,再給i+1;++i是先給i+1,再用i的值。注意一下,當i++和++i單獨使用時,兩者結果沒有區別,但當他們和其他運算符混合運算時,就會出現上述用值與+1順序的區別。

public class Test1 {
    public static void main(String[] args) {
        int i=10,j=10;
        i++;j++;
        //單獨使用兩者結果一樣
        System.out.println(i +" "+ j);//打印結果爲11 11
        int k1=i++;
        int k2=++j;
        //i和j都是11,但k1和k2結果不同
        //計算k1時,先把i值賦給k,再給i+1,所以k1=11,i=12
        //計算k2時,先給j+1,再把j值賦給k,所以k2=12,j=12
        System.out.println(k1 +" "+ k2);//打印結果爲11 12
        System.out.println(i +" "+ j);//打印結果爲12 12
    }
}

以上闡述的我估計大家都知道,但大家想過以下代碼的執行結果是什麼嗎?

public class Test1 {
    public static void main(String[] args) {
        int i=0,k=0;
        for (int j = 0; j < 10; j++) {
            i=i++;
            k=++k;
        }
        System.out.println(i+" "+k);
    }
}

按照上面對i++和++i的總結,大家可能會認爲i=i++可以解析爲先把i賦值給等號左邊的i,再把i+1賦值給i,這樣循環10次,i的結果爲10;k=++k可以解析爲先給k+1,再把k+1的值爲給k,這樣循環10次,k的結果爲10,所以最終的打印結果爲10 10.
我們來看看大家的答案對不對:
在這裏插入圖片描述
黑人問號臉…

這就要引出Java中的中間緩存變量機制
Java中有一箇中間緩存變量機制,當進行++操作時,先用一箇中間緩存temp將++的值存起來。
i++:temp=i----->i+1------>把i+1的結果賦給i
j=i++:temp=i------>i+1------>把i+1的結果賦給i------>j=temp
有人可能覺得這和上面說的先用i,再給i+1不同,這裏是最後才把存在temp中的i拿來用,大家可以這樣理解,先用i,再給i+1和這裏的解釋雖然不同,但是得到的結果都是j保存i原來的值,而i=i+1,上面的說法是爲了讓大家更容易理解,這裏的說法更符合底層實現。
根據以上解釋可知:
i=i++: temp=i------>i+1------>把i+1的結果賦給i------>i=temp
大家看一下,不管怎麼加,最後都是把中間緩存temp中的值賦給i,所以i的值還是原來的值。

++i:temp=i----->i+1------>把i+1的結果賦給i和temp
j=++i:temp=i------>i+1------>把i+1的值賦給i和temp------->把temp的值賦給j
在這我是有疑問的,是像我寫的那樣把i+1的結果賦給i和temp還是不更新temp,直接把i的值賦給j ???我查了很多資料都沒有查到,就按照把i+1的值賦給i和temp理解了,如果誰知道,可以在評論區裏知道我一下,謝謝。
i=++i:temp=i------>i+1------>把i+1的值賦給i和temp------->把temp的值賦給i,這裏等號左邊的i得到的永遠是加過1的值
看完這些大家應該能理解上面的運行結果爲什麼是 0 10 而不是 10 10 了吧。

以上均爲個人查閱資料後的理解,大家如果覺得有問題歡迎在留言區討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章