警惕自增的陷阱

  1. public static void main(String[] args) {
  2. int count =0;
  3. for(int i=0;i<10;i++){
  4. count=count++;
  5. }
  6. System.out.println("count="+count);
  7. }
       運行結果是 count 等於 0。 爲什麼呢?
       count++ 是一個表達式, 是有返回值的, 它的返回值就是 count 自加前的值, Java 對自加是這樣處理的 : 首先把 count 的值( 注意是值, 不是引用) 拷貝到一個臨時變量區, 然後對 count 變量加 1, 最後返回臨時變量區的值。 程序第一次循環時的詳細處理步驟如下:
      步驟 1 JVM 把 count 值( 其值是 0) 拷貝到臨時變量區。
      步驟 2 count 值加 1, 這時候 count 的值是 1。
      步驟 3 返回臨時變量區的值, 注意這個值是 0, 沒修改過。
      步驟 4 返回值賦值給 count, 此時 count 值被重置成 0。
“count=count++”這條語句可以按照如下代碼來理解:
  1. public static int mockAdd(int count){
  2. // 先保存初始值
  3. int temp =count;
  4. // 做自增操作
  5. count = count+1;
  6. // 返回原始值
  7. return temp;
  8. }
      於是第一次循環後 count 的值還是 0, 其他 9 次的循環也是一樣的, 最終你會發現 count的值始終沒有改變, 仍然保持着最初的狀態。
     解 決 方 法 很 簡 單, 只 要 把“count=count++” 修 改 爲“count++” 即 可。 該 問 題 在 不 同 的 語 言 環 境 有 不 同 的 實 現 : C++ 中“count=count++” 與“count++”是等效的, 而在 PHP 中則保持着與 Java 相同的處理方式。 每種語言對自增的實現方式各不同, 讀者有興趣可以多找幾種語言測試一下, 思考一下原理。

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