本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙
一般来讲,在进入循环体之后,会执行该循环体内的所有内容,叫做一次循环;当该次循环结束后会再次判断,看是否会进入下一次的循环。但是有的时候,我们会希望在程序在执行了循环体的一半时退出,直接跳出本轮循环,或者忽略下面的语句开始下一轮的循环。具体来讲的话,就是通过 break
语句和 continue
语句来实现。
break 语句在之前 《8. C 语言 – 分支结构: switch 和 break 语句》有讲过
当 switch 跳到某个位置之后,就会一直往下执行,比如说它满足了 case 常量表达式1 的要求之后会自动执行剩下的所有的语句和程序块,而无需判断是否满足前面所对应的 case 。所以如果只希执行某一个 case 后面的语句和程序块,还需要配合一个 break 语句,让代码在适当的位置跳出 switch
在循环体中,如果我们想要让程序在中途跳出循环,那么我们同样可以使用 break
语句来实现。执行 break
语句,直接跳出循环体。
举个例子,如下是上次判断一个数是否是素数的代码
#include
int main()
{
long long i, num;
_Bool flag = 1;
printf("请输入一个整数:");
scanf("%lld", &num);
for (i = 2; i < num / 2; i++){
if (num % i == 0){
flag = 0;
// break;
}
}
if (flag){
printf("%lld是一个素数!\n", num);
}
else{
printf("%lld不是一个素数!\n", num);
}
printf("i = %lld\n", i);
return 0;
}
这段程序相当于穷举从 2 到 n//2 的所有数字,来判断是否存在一个数字可以整除待判断的数字。很明显,每次执行这个程序会至少执行 n//2 -2 遍。假如输入的是 10,其实在 i=2
时候就可以得到最终的结果了,但是后面的那些步骤还是会执行的,这就造成了对于资源和时间的浪费。
如果我们将 break
的注释去掉,那么很明显当已经判断该数是质数之后,会直接跳出循环体,结束整个循环,并返回判定结果 – 该数是一个素数。
有一点需要注意的是,对于嵌套循环来说,break
语句只负责跳出所在的那一层循环,要跳出外层循环则需要再布置一个 break
语句才行。
我们同样以 《C语言 – 循环结构:for 语句和嵌套循环》中的例子来说明,将 4.1 部分改写为如下的形式
#include
int main()
{
int i, j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (j == 3)
{
break;
}
}
// if (j == 3){
// break;
// }
}
printf("i = %d, j = %d \n", i, j);
return 0;
}
观察上面的代码,首先思考一个问题,这段代码会输出什么?当 i=0
的时候,j
的值会一直增大直至到 3。当 j = 3 的时候遇到 break 跳出该层循环,但是刚刚讲过,他只能跳出一层循环,所以还会继续执行 i 的那层循环,然后还是j
的值会一直增大直至到 3……这样一直下去,最后打印输出的当然是 i = 10, j = 3
。明显,break 只能跳出一层循环,如果想在 j=3 的时候跳出两层循环,将注释的部分去掉就可以了。
还有一种情况是在满足某一种情况的时候,跳过本轮循环下面的语句,开始下一轮循环,可以使用 continue
语句。当使用 continue
语句的时候,循环体剩余的语句将会被忽略,开始下一次的循环。
比如说下面这个例子
#include
int main()
{
int ch;
while ((ch = getchar()) != '\n')
{
if (ch == 'C')
{
continue;
}
putchar(ch);
}
putchar('\n');
return 0;
}
在之前的《C 语言 – 循环结构:while语句和 do … while语句》的 3.2 部分有讲过,getchar()
函数返回的是一个 int
型的数,所以在声明的时候写的是 int ch;
,putchar(ch);
是将刚刚接收到的字符输出。在这段代码中循环的终止条件是接收到一个 回车 字符,对于输入的每一个字符,如果是大写的 C 就结束本轮循环,开启下一轮,所以上面代码的作用就是去掉输入字符中指定的字母©。
使用 gcc 进行编译执行,输入 ABCD
,可以得到 ABC
。
与 break
相同的是,continue
也只能作用于一层循环体。两者的不同点在于, break
直接跳出循环体,相当于提前结束了整个循环;但是 continue
只是结束本轮循环,更新计数器之后,开始新的一轮循环。
经过《C语言 – 循环结构:for 语句和嵌套循环》可能会认为 while 语句与 for 语句的功能是相同的,但是实际上两者的执行过程是有区别的,它们的区别在于出现 continue 语句时,比如说下面的这段代码
#include
int main()
{
int i;
for (i = 0; i < 100; i++){
if (i % 2){
continue;
}
}
return 0;
}
虽然没有什么实质的功能,只是用来评测两种循环的效果,但是这段代码是可以顺利执行完毕的,但是如果我们将它改写为如下的 while 形式
#include
int main()
{
int i = 0;
while ( i < 100)
{
if (i % 2)
{
continue;
}
i++;
}
return 0;
}
会陷入什么样的情况呢?没错死循环。当 i=0 的时候 i%2=0,不会执行 continue,执行 i++;然后当 i=1 的时候, i%2=1,会执行 continue,忽略下面的 i++;之后的都是这样的,陷入了死循环。
所以我们可以看到,在 for 语句中,continue 语句跳过循环的剩余部分,直接回到调整部分。在 while 语句中,调整部分是循环体的一部分,因此 continue 语句会把它也跳过。所以在 while 语句中千万不要把更新计数器(如 i++)放在 continue 语句的下面,否则很容易陷入死循环。当然,你如果是出与一些目的特意设计成这个样子也是没有问题的~
[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P15
欢迎大家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)