错误锦集一:循环退出条件(递归退出条件)

来源:互联网 发布:糯米胶品牌 知乎 编辑:程序博客网 时间:2024/05/01 16:24
 

循环,就是一次一次的重复。许多时候,需要做多次重复的事情,这个时候就需要循环了。循环,给我们带来的极大的简便。不敢想象,世界没有循环和递归的代码会是怎样的!

但是,用循环的时候,一个很重要的事情就是退出条件设置!!!循环虽好,但是不能总在循环里面不出来(不出来就是死循环了)。不过一般而言,不是不出来,而是出不来,就是因为循环退出条件设置有问题。退出条件设置相关的有两个元素:循环变量和比较条件。循环变量一般在循环中不断变化,而比较条件则是循环变量循环变化的极限值(就是循环变量退出时候的达到的值),一般是常量(一般是固定的值,但是有的时候特殊需要也会弄成变量。强烈建议比较条件不要弄成变量,尽量用其他替代方案!)。

由于粗心,好几次都搞成了死循环,在此一一列出。

1、  要注意类型的极值。经常的循环变量是用整数表示,那么比较条件也是一个整数。有一次,用了unsigned char 类型的循环变量,然后比较条件是256.但是,unsigned char的最大值是255,就是说,循环变量是永远小于256的——死循环咯。

建议:这种情况,首先要做的,就是记几个整数的极值,也就几个(1字节的,2字节的,4字节的)。另外,规避方案:该情况一般是用来计数的,个数一般不会太多,所以可以直接用int,应该可以都包含进去了;另外,如果是遍历的话,可以指针+end指针 来作为结束条件。

 

    2、  保证while循环中循环变量在变化。好几次,在写了while之后,在写了一系列do something之后,最后忘了写循环变量变化的代码了(T_T)!当然,还有些情况就是,原来写的好好的,但是,在do something之中有增加了几个if判断,而这里continue的之前,忘了dosomething了。

       建议:最完美的解决方案就是用for,该循环的循环变量变化、退出条件都是放在最开始了,之后的do something一般不用管了。当然,如果特殊需要,要用while,那么就养成好习惯:while之后,大括号之后,立马在之中写循环变量变化语句,然后再写do something。Continue之前,一定要写循环变量变化。当然,有些人、或者有些时候,循环变量变化也直接写在while同一行了,比如读文件经常就这么写:while (EOF != (fread(buff,1024,1,fp))){….}

 

    3、  一次循环中,尽量保证循环变量就变化一次!有一次,我退出条件是用的”!=”来判断的,而一次循环中循环变量可能有多次++,最后导致跳过了比较条件那个值,进入死循环。当然,这个可以用”<”,”>”来规避。这样退出没问题了,但是,在循环中的do something可能会做多次,因为循环变量可能会多变化了一次!所以,除非特殊需要,否则建议不要用。

 

       4、  递归。递归,是写的方便,用起来麻烦。思路清晰,实现方便,是递归的优势;但是,一旦有问题,排查起来很麻烦,因为一层一层很多层,很难搞。所以,我一般对递归是敬而远之。至于用递归,要注意的地方,我觉得还是退出条件。退出条件,我没有什么特别好的建议。但是,如果没信心,那么我建议用个计数器记录深度,每递归一次,加1,如果达到一定的深度,那么就直接return,退出的时候,也可以-1(根据需要)。这样,至少深度不会死循环。当然,如果需要,广度上也可以设个计数的。