探討i++跟++i

通常的理解:
Java中,提起i++就知道是先賦值後自增,提起++i就知道是先自增後賦值,那麼來看下面一段程序:

public class Demo{
	public static void main(String[] args) {
		int x = 0;
		for (int y = 0; y < 5; y++) {
			x = x++;
			System.out.println("x=" + x);
		}

		/* 	控制檯輸出結果:
			x=0
			x=0
			x=0
			x=0
			x=0
		*/
	}
}

問題的引出
爲何輸出結果都是0?變量x自加了嗎?看到這最好自己思考一下。
x=x++; 這條語句按照先賦值後自增思路是,先把x賦值給x,x等於0,然後x=x+1,x等於1?但前邊已經做了賦值運算了,後面的算怎麼回事?與x無關嗎?

問題的分析:
i++,++i其實是一個依賴於Java裏面的“中間緩存變量機制”來實現的。
比如 i = j++

temp = j; // 先賦值給中間緩存變量
j = j + 1;// 後自加
i = temp; 
再比如 i = ++j
j = j + 1;// 先自加
temp = j; // 後賦值給中間緩存變量
i = temp;

那麼在以上程序中,x=x++; 進入循環:

temp=x; // 先賦值
x = x + 1; // 後自加
x = temp; // temp現在等於0,那賦值完畢後,x等於0。賦值完畢,temp內存釋放。

循環5次結束後,執行了5次上面的代碼,所以輸出5次0。
而如果是x=++x,程序就不會出現上面的情況,如下:

x = x + 1; // 先自加
temp = x; // 後賦值給中間緩存變量
x = temp;
/* 控制檯輸出:
    x=1
    x=2
    x=3
    x=4
    x=5
*/

爲了加強對i++,++i的理解,再來分析一段小程序:

// 程序演示示例:
int i = 10;
i = i++ + i++; // 拆分:temp1=i(10)、i=i+1(11)、temp2=i(11)、i=i+1(12)、i = temp1(10)+temp2(11)
System.out.println(i); // 輸出21
i = ++i + ++i; // 拆分:i=i+1(22)、temp1=i(22)、i=i+1(23)、temp2=i(23)、i = temp1(22)+temp2(23)
System.out.println(i); // 輸出45

總結:
i++,++i是一個依賴於Java裏面的“中間緩存變量機制”來實現的。


原創文章,轉載請註明出處:http://blog.csdn.net/thinking_in_android

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章