posts - 42, comments - 7, trackbacks - 0, articles - 1

          for 循環與while循環的等價

          Posted on 2007-10-29 19:56 TuringJava 閱讀(640) 評論(0)  編輯  收藏 所屬分類: J2SE

          在進行for循環和while循環的等價轉換的時候,要注意到循環條件的順序。下面的分析說明了這一點:

          插入排序的for循環版本:
           insertSort(int[] array) {
            int key;
            int i,j;
            /*for 循環*/
            for(i = 1; i < array.length; i++ )
                  {
                      key = array[i];
                      for(j = i; j > 0 && key < array[j - 1]; j--)
                          array[j] = array[j - 1];

                      array[j] = key;
                  }
          }

          下面程序片段是插入排序的while循環版本:
          insertSort(int[] array) {
            int key;
            int i,j;
              /*用while循環*/
             for (i = 1; i < array.length; i++) {
             key = array[i];//當前的要進行插入的數值
             j = i;
             while( array[j -1] > key && j >0) 
              {   
              array[j] = array[j-1];
              j--;
               }

             array[j] = key;
            }
           }

          初看這兩個程序片段的時候,似乎是等價。但是編譯執行的時候,for循環的版本可以通過,而while循環的版本卻報出數組越界的錯誤。分析了好久,也沒搞明白原因。最后,對程序進行調試后才發現了其中的錯誤。正確的while循環應該是這樣的:
          while( j>0 && array[j-1] > key){   
              array[j] = array[j-1];
              j--;
             }

          對比兩個while循環,相當的類似,其細微的區別僅在于while循環條件的順序不一樣,錯誤的while循環條件是:
           array[j -1] > key && j >0…………1
          正確的是:
          j>0 && array[j-1] > key……………2
          這就涉及到了while循環條件表達式的執行順序。如果當j=0時候,表達式1取出array[j-1]時,j-1=-1,數組越界了。而表達式2先對j進行判斷就排除了j=0的可能性。

          該錯誤表明了,在構造while循環的判斷表達式的時候,對循環條件的考慮要周全,同時也說明了一點,在進行條件與(&&)操作時候,如果第一個條件是flase,其后的條件就不必要進行判斷了。
          貌似簡單的一個道理,在我們編程的過程中,經常會被遺忘。
          主站蜘蛛池模板: 隆林| 府谷县| 怀集县| 土默特左旗| 庆城县| 浪卡子县| 扎赉特旗| 宁国市| 余江县| 伊宁县| 红河县| 天祝| 三台县| 丰宁| 青铜峡市| 绵竹市| 涡阳县| 隆化县| 博客| 永兴县| 麦盖提县| 镇原县| 大洼县| 郴州市| 张北县| 宁津县| 仲巴县| 故城县| 鲁山县| 兴仁县| 镇雄县| 靖州| 吴忠市| 澎湖县| 大洼县| 安达市| 宁波市| 洞头县| 澜沧| 孟连| 忻城县|