通常的理解:
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 = ++jj = 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