第十六章--控制循环
16.1--选择循环的种类
1.在大多数语言中,你只能用到少数几种循环:
(1)计数循环:执行次数一定。
(2)连续求值的循环:预先并不知道将要执行多少次,它会在每次迭代时检查是否应该结束。
(3)无限循环:一旦启动就一直执行下去。
(4)迭代器循环:对容器类里面的每个元素执行一次操作。
2.什么时候使用while循环
(1)如果你不知道循环要执行多少次,那么就使用while循环。
(2)对于在开始处进行检测的循环,可以使用while循环(或模拟while循环)。
(3)当你需要一个灵活的循环,但是该循环至少需要至少执行一次。这种情况下,可以用在结尾处做检测的循环(或模拟这样的while循环)。
3.什么时候用待退出的循环
带退出的循环就是终止条件出现在循环中间的循环。
(1)正常的带退出循环。使用场合:如果把循环条件检测放在循环开始或结束处,那就需要写出一个半循环的代码,此时可用带退出的循环。
在使用这种循环的时候,请注意下面细节:
*把所有的退出条件放在一处。
*用注释来阐明操作意图。
*待退出的循环也是单入单出得结构化控制结构,也是一种首选的循环控制。
(2)非正常的带退出的循环。如利用goto语句直接跳到循环体中。如果你的语言不支持break命令,那么可以使用goto来模拟break,但是goto使用要谨慎。
4.何时使用for循环
(1)如果你需要一个执行次数固定的循环,那么for循环就是一个很好的选择。
(2)可以用for循环来执行那些不需要循环内部控制的简单操作。如递增递减。
(3)不要在for循环里通过直接修改下标值的方式迫使它终止,在这种情况下应该该改用while循环。
(4)for循环就是为了简单的用途,复杂的最好用while。
5.何时使用foreach循环
foreach循环或其等价物很适用于对数组或者其他容器的各项元素执行操作。
16.2--循环控制
1.循环会出现的错误大致有下面几种:
(1)忽略或错误地对循环执行初始化;
(2)忽略了对累加变量或者其他与循环有关的变量执行初始化;
(3)不正确的嵌套;
(4)不正确的循环终止;
(5)忽略或者错误地增加了循环变量的值;
(6)用不正确的循环下标访问素组元素;
解决方法大致有两种:一是减少能影响该循环各种因素的数量,简化,简化,再简化!二是把循环内部当做一个子程序看待--把控制尽可能放在循环体外。
2.进入循环
在代码进入循环时,使用下述指导原则:
(1)只从一个位置进入循环。
(2)把初始化代码紧放在循环前面。
(3)用while(true)表示无限循环。
(4)在适当的情况下多使用for循环。
(5)在while循环更适用的时候,不要使用for循环。
3.处理好循环体
下面讲解如何处理循环体:
(1)用“{”和“}”把循环体中的语句括起来。
(2)避免空循环。
(3)把循环内务操作要么放在循环的开始,要么放在循环的末尾。
(4)一个循环只做一件事。
4.退出循环
(1)设法确认循环能够终止。
(2)使循环终止条件看起来很明显。
(3)不要为了终止循环而胡乱改动for循环的下标。
(4)避免出现依赖于循环下标最终取值的代码。
(5)考虑使用安全计数器。
5.提前退出循环
(1)考虑在while循环中使用break语句而不用布尔标记。
(2)小心那些有很多break散布其中的循环。
(3)在循环开始处用continue进行判断。
(4)如果语言支持,请使用待标号break结构。
(5)使用break和continue时要小心谨慎。break就使阅读代码的人必须去读循环体,才能理解循环是如何控制的。
6.检查端点
对于一个简单的循环,通常要注意三种情况:开始的情况,任意选择的中间情况,以及最终的情况。在你创建循环的时候,应在脑海里运行这三种循环情况,以确认该循环不会出现任何off-by-one(偏差一)错误。可以通过手工计算来检查。
7.使用循环变量
下面是使用循环变量的一些指导原则:
(1)用整数或者枚举类型表示数组和循环的边界。
(2)在嵌套循环中使用有意义的变量名来提高其可读性。
(3)用有意义的名字来避免循环下标串话。习惯性使用i,j,k有可能会导致下标串话。
(4)把循环下标变量的作用域限制在循环体。
8.循环应该有多长
(1)循环要尽可能地短,以便能够一目了然。
(2)把嵌套限制在3层以内。
(3)把长循环的内容移到子程序里。
(4)要让长循环格外清晰。
16.3--轻松创建循环--由内而外
一般的处理过程:
(1)在注释里写下循环体需要执行的操作步骤。
(2)在还没有编写整个循环之前,尽可能多地把循环体内的注释转化成代码。
(3)在数组中加入下标。
(4)给现有语句外面加上一层循环。
(5)写出必要的初始化代码。
16.4--循环和数组的关系
循环和数字关系密切,很多情况下,循环就是用来操纵数组的。