
呵呵, count 等于幾?
public static void main(String args[]){
int count = 0;
for (int i = 0; i < 10; i++){
count = count ++;
}
System.out.print("count:"+count);
}
這段程序說出的是多少呢?
是不是 count 自加10 ,答案等等于10嗎?
可是我可以非??隙ǖ母嬖V你,答案錯誤!運行結果是count 等于 0。
** why? **
count ++ 是一個表達式,是有返回值的,它的返回值就是 count 自加前的值,Java 對自加是這樣處理的:首先把 count 的值(注意是值,不是引用)拷貝到一個臨時變量區(qū),然后對 count 變量加 1,最后返回臨時變量區(qū)的值。程序第一次循環(huán)時的詳細步驟如下:
** 步驟1** JVM 把 count 值(其值是0)拷貝到臨時變量區(qū)。
步驟2 count 值加 1,這時候 count 的值 是 1。
** 步驟3** 返回臨時變量區(qū)的值,注意這個值是 0 ,沒修改過。
步驟4 返回值賦值給 count,此時 count 值被重置成 0。
“count = count ++” 這條語句可以按照如下代碼來理解:
public static int add(int count){
//先保存初始值
int temp = count;
//做自增操作
count = count + 1;
//返回原始值
return temp;
}
于是第一次循環(huán)后 count 的值還是 0 ;其他 9 次的循環(huán)也是一樣的,最終你會發(fā)現(xiàn) count 的值始終沒有改變,仍然保持著最初的狀態(tài)。
此例中代碼的作者的本意是希望 count 自增,所以想當然低認為賦值給自身就成了,不曾想掉到 Java 自增的陷阱中了。解決方法很簡單,只要把 “count = count ++” 修改為 “count ++”即可。該問題在不同的語言環(huán)境有不同的實現(xiàn): C++ 中 “count = count ++” 與 “count ++” 是等效的,而在 php 中則保持著與 Java 相同的處理方式。每種語言對自增的實現(xiàn)方式各不同,讀者感興趣可以找?guī)追N語言測試一下,思考下原理。
正確的代碼貢獻于此:
public static void main(String args[]){
int count = 0;
for (int i = 0; i < 10; i++){
count ++;
}
System.out.print("count:"+count);
}
哈哈,下次如過你在某大街上看到某人的T恤上印著 i = i++,千萬別小看他,說不定就是大神。說到這里了,呵呵,還不趕緊去裝個逼!??!
總結:
基礎很重要,任何時候不要覺得自己很牛逼,時刻告誡自己需要學習的還有很多,在你感覺自己很滿足的時候請你回頭看看你曾經(jīng)丟下的看不起的基礎知識,看看你是否能真正的理解呢!
本文思路來自讀:《編寫高質量代碼之Java》所感所悟,寫此時刻警醒自己,學習永無止境?。?!