7.6 循环辅助手段:continue和break

一般说来,进入循环体以后,在下次循环判断之前程序执行循环体中所有的语句。continue和break语句使您可以根据循环体内进行的判断结果来忽略部分循环甚至终止它。

7.6.1 continue语句

该语句可以用于三种循环形式。当运行到该语句时,它将导致剩余的迭代部分被忽略,开始下一次迭代。如果continue语句处于嵌套结构中,那么它仅仅影响包含它的最里层的结构。让我们在程序清单7.9的简短程序中来试验一下continue。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

程序清单7.9 skippart.c程序

阅读 ‧ 电子书库

阅读 ‧ 电子书库

在程序清单7.9中,while循环读取输入内容,直到输入非数字数据。循环里的if语句筛选出无效的分数值。比如,如果输入188,那么程序就会说明:188 is an invalid value。然后,continue语句导致程序跳过循环其余的用于处理有效输入的部分。程序开始下一个循环周期,试图读取下一个输入值。

注意,有两种方法可以避免使用continue。一种是省去continue,将循环的剩余部分放在一个else代码块中:

阅读 ‧ 电子书库

或者用这种格式来代替:

阅读 ‧ 电子书库

在这种情况中使用continue的一个好处是可以在主语句组中消除一级缩排。当语句很长或者已经有很深的嵌套时,简练可以增强可读性。

continue的另一个用处是作为占位符。例如,下面的循环读取并丢弃输入,直到一行的末尾(包括行尾字符):

阅读 ‧ 电子书库

当程序已经从一行中读取了一些输入并需要跳到下一行的开始时,使用上面的语句很方便。问题是孤立的分号难以被注意。如果使用continue,代码就更具可读性,如下所示:

阅读 ‧ 电子书库

如果它不是简化了代码,而是使代码更加复杂,就不要使用continue。例如,考虑下面的代码段:

阅读 ‧ 电子书库

该循环跳过制表符,并且仅当遇到换行符时退出。它可以更简洁地这样表示:

阅读 ‧ 电子书库

通常,在这种情况下,可以把if的判断取逆以消除对continue的需求。

您已经看到了continue语句导致循环体的剩余部分被跳过。那么在什么地方继续循环呢?对于while和do while循环,continue语句之后发生的动作是求循环判断表达式的值。例如,考虑下列循环:

阅读 ‧ 电子书库

它读入10个字符(换行符除外,因为当ch为换行符时会跳过count++;语句)并回显它们,其中不包括换行符。continue语句被执行时,下一个被求值的表达式是循环判断条件。

对于for循环,下一个动作是先求更新表达式的值,然后再求循环判断表达式的值。例如,考虑下列循环:

阅读 ‧ 电子书库

在本例中,当continue语句被执行时,首先递增count,然后把count与10相比较。因此,这个循环的动作稍稍不同于whlie循环的例子。像前面那样,仅仅显示非换行符,但这时换行符也被包括在计数中,因此它读取包含换行符在内的10个字符。

7.6.2 break语句

循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段。在程序清单7.9中,如果用break代替continue,那么(比方说)在输入了188的时候,不是跳到下一个循环周期,而是导致循环退出。图7.4比较了continue和break。如果break语句位于嵌套循环里,它只影响包含它的最里层的循环。

有时break被用于在出现其他原因时退出循环。程序清单7.10用一个循环来计算矩形的面积。如果用户输入一个非数字作为矩形的长度或宽度,那么循环终止。

阅读 ‧ 电子书库

图7.4 比较break和continue
程序清单7.10 break.c程序

阅读 ‧ 电子书库

阅读 ‧ 电子书库

也可以这样控制循环:

阅读 ‧ 电子书库

但是,使用break可以使单独回显每个输入值更方便。

和continue一样,当break使代码更复杂时不要使用它。例如,考虑下列循环:

阅读 ‧ 电子书库

如果两个判断都在同一个位置,逻辑就更清晰了:

阅读 ‧ 电子书库

break语句实质上是switch语句的附属物,这在后面讨论。

break语句使程序直接转到紧接着该循环后的第一条语句去执行;在for循环中,与continue不同,控制段的更新部分也将被跳过。嵌套循环中的break语句只是使程序跳出里层的循环,要跳出外层的循环则还需要另外一个break语句。

阅读 ‧ 电子书库