在進行for循環(huán)和while循環(huán)的等價轉(zhuǎn)換的時候,要注意到循環(huá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;
}
}
insertSort(int[] array) {
int key;
int i,j;
/*用while循環(huán)*/
for (i = 1; i < array.length; i++) {
key = array[i];//當(dāng)前的要進行插入的數(shù)值
j = i;
while( array[j -1] > key && j >0)
{
array[j] = array[j-1];
j--;
}
array[j] = key;
}
}
初看這兩個程序片段的時候,似乎是等價。但是編譯執(zhí)行的時候,for循環(huán)的版本可以通過,而while循環(huán)的版本卻報出數(shù)組越界的錯誤。分析了好久,也沒搞明白原因。最后,對程序進行調(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時候,表達(dá)式1取出array[j-1]時,j-1=-1,數(shù)組越界了。而表達(dá)式2先對j進行判斷就排除了j=0的可能性。
該錯誤表明了,在構(gòu)造while循環(huán)的判斷表達(dá)式的時候,對循環(huán)條件的考慮要周全,同時也說明了一點,在進行條件與(&&)操作時候,如果第一個條件是flase,其后的條件就不必要進行判斷了。
貌似簡單的一個道理,在我們編程的過程中,經(jīng)常會被遺忘。