跳转到内容

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 语句。注意主程序的局部变量 iis_prime 中的局部变量 i 是不同的两个变量,其实在调用 is_prime 函数时主程序的局部变量 i 和参数 n 的值相等。

习题

  1. 求素数这个程序只是为了说明 breakcontinue 的用法才这么写的,其实完全可以不用 breakcontinue ,请读者修改一下控制流程,去掉 breakcontinue 而保持功能不变。
  2. 上一节讲过怎样把 for 循环改写成等价的 while 循环,但也提到如果循环体中有 continue 语句这两种形式就不等价了,想一想为什么不等价了?