6.4 break和continue语句
在第4.4节中我们见到了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语句。注意主程序的局部变量i和is_prime中的局部变量i是不同的两个变量,其实在调用is_prime函数时主程序的局部变量i和参数n的值相等。
习题
1.例6.1只是为了说明break和continue的用法才这么写的,其实完全可以不用break和continue,请读者修改一下控制流程,去掉break和continue而保持程序整体功能不变。
2.上一节讲过怎样把for循环改写成等价的while循环,但也提到如果循环体中有continue语句这两种形式就不等价了,为什么呢?