for 循环与while循环的等价

本文通过插入排序算法的实现,展示了for循环与while循环之间的等价转换,并深入分析了循环条件顺序对程序正确性的影响。文章指出,在进行条件与操作时,若第一个条件为假,则后续条件不必再进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行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,其后的条件就不必要进行判断了。 貌似简单的一个道理,在我们编程的过程中,经常会被遗忘。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值