读书笔记_代码大全_第16章_控制循环

控制循环

愿我的读书笔记能带你翻过20页的书 http://www.cnblogs.com/jerry19880126/

首先复习一下循环的种类,主要分成for循环与while循环。其中for循环在已知执行次数时使用,比如for(int i = 0; i < 10; ++i)就是指针循环10次;while循环多用于执行次数未知的场合,往往要添加一定的条件,比如while(条件){…},当条件满足时会执行循环体内的代码,执行完一次后,再去判断条件是否满足,依此规律执行下去。while还有do…while的变式,即do{…}while(条件),这种情况下循环体是至少执行一次的。

但在实际编程中,更常用带退出的循环,即while和break组合使用,比如

1 while(true)
2 {
3 …
4 if(满足某个退出条件) { break;}
5 …
6 }

Soloway展开的一项研究指出,这种带退出的循环结构要比其他循环结构更接近于人类思考方式,学员们在一份理解力测试中的得分提高了25%。

本章给出了书写循环的一些好的方法:

(1) 首先是进入循环,应该只从一个位置进入循环,不要像下面这样用goto语句:

1 goto Start;
2 while(表达式)
3 {
4 …
5 Start:
6 …
7 }

 

(2) 用“{”和“}”把循环中的语句括起来,哪怕循环体只有一句话:

1 while(表达式)
2 {
3 cout << “Hello” << endl;
4 }

这个方法同样适用于if语句,尽管一条语句加不加大括号都是可以的,但加上后会使可读性提高,而且万一以后要对代码进行扩充,就会显得比较方便。

 

(3) 一个循环只做一件事

循环应跟子程序一样,只做一件事并把它做好,一心两用的结果就是质量差的代码。

 

(4) 退出循环时,不要为了终止循环而胡乱改动for循环下标,如:

 1 for(int i = 0; i < 100; ++i)
 2 {
 3     …
 4     if(条件)
 5     {
 6         i = 100;
 7     }
 8     …
 9 }

这样为了终止循环而在循环体内给下标赋值的事情是非常可怕的,为什么不用一句简单的break呢?

 

(5) 避免出现依赖于循环下标最终取值的代码

这种不好的写法其实我自己也常常这样做,比如:

 1 int i = 0;
 2 for(i = 0; i < 100; ++i)
 3 {
 4     if(entry[i] == valueToFind)
 5     {
 6         break;
 7     }
 8 }
 9 if(i < 100) {cout << “find the value” << endl;}
10 else {…}

这样做的代价是把i的作用域由块提升到了函数内,这就不符合作用域越小越好的准则了。我们可以这样来改进代码:

 1 bool found = false;
 2 for(int i = 0; i < 100; ++i)
 3 {
 4     if(entry[i] == valueToFind)
 5     {
 6         found = true;
 7         break;
 8     }
 9 }
10 if(found) {cout << “find the value” << endl;}
11 else {…}

通过添加bool类型的found变量,有效地使i局限到块内,而且提升了程序的可读性。

 

(6) 循环次数计数器不要用浮点表示

有时常常用循环次数来表示循环终止的条件,比如:

1 int count = 0;
2 while(count < 10)
3 {
4     …
5     ++ count;
6 }

注意count不要用float和double,因为浮点的表示是近似的,99999.0+1的结果很可能还是99999.0!

 

(7) 控制循环体的长度

循环要尽可能地短,这样可以一目了然,一些研究表明,把嵌套控制在3层以内地比较好,另外,把长循环的内容移到子程序里会提升循环的可读性。

 

下面列出本章的要点:

(1)     循环本身是复杂的控制结构,所以保持循环体的简单将有助于别人阅读你的代码;

(2)     循环的入口要单一,出口也要明确;

(3)     避免出现依赖于循环下标最终取值的代码;

(4)     仔细考虑循环,确保在每一种情况下都能运行正常,并且所有可能的条件下都能正常退出。

<end>

posted @ 2012-12-25 22:36  Jerry19880126  阅读(621)  评论(0编辑  收藏  举报