Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

4. break 和 continue 语句

第 4 节 “switch 语句”中我们见到了 break 语句的一种用法,用来跳出 switch 语句块,这个语句也可以用来跳出循环体。 continue 语句也会终止当前循环,和 break 语句不同的是, continue 语句终止当前循环后又回到循环体的开头准备执行下一次循环。对于 while 循环和 do/while 循环,执行 continue 语句之后测试控制表达式,如果值为真则继续执行下一次循环;对于 for 循环,执行 continue 语句之后首先计算控制表达式 3,然后测试控制表达式 2,如果值为真则继续执行下一次循环。例如下面的代码打印 1 到 100 之间的素数:

例 6.1. 求 1-100 的素数

#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 语句这两种形式就不等价了,想一想为什么不等价了?