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

          for 循環(huán)與while循環(huán)的等價(jià)

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

          在進(jìn)行for循環(huán)和while循環(huán)的等價(jià)轉(zhuǎn)換的時(shí)候,要注意到循環(huán)條件的順序。下面的分析說明了這一點(diǎn):

          插入排序的for循環(huán)版本:
           insertSort(int[] array) {
            int key;
            int i,j;
            /*for 循環(huán)*/
            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循環(huán)版本:
          insertSort(int[] array) {
            int key;
            int i,j;
              /*用while循環(huán)*/
             for (i = 1; i < array.length; i++) {
             key = array[i];//當(dāng)前的要進(jìn)行插入的數(shù)值
             j = i;
             while( array[j -1] > key && j >0) 
              {   
              array[j] = array[j-1];
              j--;
               }

             array[j] = key;
            }
           }

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

          對比兩個while循環(huán),相當(dāng)?shù)念愃疲浼?xì)微的區(qū)別僅在于while循環(huán)條件的順序不一樣,錯誤的while循環(huán)條件是:
           array[j -1] > key && j >0…………1
          正確的是:
          j>0 && array[j-1] > key……………2
          這就涉及到了while循環(huán)條件表達(dá)式的執(zhí)行順序。如果當(dāng)j=0時(shí)候,表達(dá)式1取出array[j-1]時(shí),j-1=-1,數(shù)組越界了。而表達(dá)式2先對j進(jìn)行判斷就排除了j=0的可能性。

          該錯誤表明了,在構(gòu)造while循環(huán)的判斷表達(dá)式的時(shí)候,對循環(huán)條件的考慮要周全,同時(shí)也說明了一點(diǎn),在進(jìn)行條件與(&&)操作時(shí)候,如果第一個條件是flase,其后的條件就不必要進(jìn)行判斷了。
          貌似簡單的一個道理,在我們編程的過程中,經(jīng)常會被遺忘。
          主站蜘蛛池模板: 莱芜市| 肃南| 延寿县| 盐城市| 无极县| 大埔县| 东乌珠穆沁旗| 朔州市| 凉山| 闽清县| 荆门市| 冕宁县| 綦江县| 诸暨市| 乌拉特中旗| 麻阳| 沾益县| 水富县| 阳新县| 龙门县| 河南省| 肥城市| 齐齐哈尔市| 嘉善县| 谢通门县| 韶关市| 沧源| 茂名市| 古浪县| 布拖县| 东乌珠穆沁旗| 玛纳斯县| 信宜市| 蒙自县| 惠安县| 泰安市| 咸宁市| 涟源市| 贵州省| 内江市| 昌都县|