控制循环
愿我的读书笔记能带你翻过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>