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語句這兩種形式就不等價了,想一想為什麼不等價了?