4. break 和 continue 语句
在 第 4 节“switch 语句” 中我们见到了 break 语句的一种用法,用来跳出 switch 语句块,这个语句也可以用来跳出循环体。 continue 语句也会终止当前循环,和 break 语句不同的是, continue 语句终止当前循环后又回到循环体的开头准备执行下一次循环。对于 while 循环和 do/while 循环,执行 continue 语句之后测试控制表达式,如果值为真则继续执行下一次循环;对于 for 循环,执行 continue 语句之后首先计算控制表达式 3,然后测试控制表达式 2,如果值为真则继续执行下一次循环。例如下面的代码打印 1 到 100 之间的素数:
例 6.1. 求 1-100 的素数
c
#include <stdio.h>
int is_prime(int n) {
int i;
for (i = 2; i < n; i++)
if (n % i == 0) break;
if (i == n)
return 1;
else
return 0;
}
int main(void) {
int i;
for (i = 1; i <= 100; i++) {
if (!is_prime(i)) continue;
printf("%d\n", i);
}
return 0;
}is_prime 函数从 2 到 n-1 依次检查有没有能被 n 整除的数,如果有就说明 n 不是素数,立刻跳出循环而不执行 i++ 。因此,如果 n 不是素数,则循环结束后 i 一定小于 n ,如果 n 是素数,则循环结束后 i 一定等于 n 。注意检查临界条件:2 应该是素数,如果 n 是 2,则循环体一次也不执行,但 i 的初值就是 2,也等于 n ,在程序中也判定为素数。其实没有必要从 2 一直检查到 n-1 ,只要从 2 检查到 ⌊sqrt(n)⌋,如果全都不能整除就足以证明 n 是素数了,请读者想一想为什么。
在主程序中,从 1 到 100 依次检查每个数是不是素数,如果不是素数,并不直接跳出循环,而是 i++ 后继续执行下一次循环,因此用 continue 语句。注意主程序的局部变量 i 和 is_prime 中的局部变量 i 是不同的两个变量,其实在调用 is_prime 函数时主程序的局部变量 i 和参数 n 的值相等。
习题
- 求素数这个程序只是为了说明
break和continue的用法才这么写的,其实完全可以不用break和continue,请读者修改一下控制流程,去掉break和continue而保持功能不变。 - 上一节讲过怎样把
for循环改写成等价的while循环,但也提到如果循环体中有continue语句这两种形式就不等价了,想一想为什么不等价了?