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

for 循环与while循环的等价

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

只有注册用户登录后才能发表评论。


网站导航: