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 了吧。
以上均爲個人查閱資料後的理解,大家如果覺得有問題歡迎在留言區討論。