Posted on 2007-10-29 19:56
TuringJava 阅读(631)
评论(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,其后的条件就不必要进行判断了。
貌似简单的一个道理,在我们编程的过程中,经常会被遗忘。