11. C语言 -- break 语句和 continue 语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dugudaibo/article/details/82979416

本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙

一般来讲,在进入循环体之后,会执行该循环体内的所有内容,叫做一次循环;当该次循环结束后会再次判断,看是否会进入下一次的循环。但是有的时候,我们会希望在程序在执行了循环体的一半时退出,直接跳出本轮循环,或者忽略下面的语句开始下一轮的循环。具体来讲的话,就是通过 break 语句和 continue 语句来实现。

1. break 语句

  break 语句在之前 《8. C 语言 – 分支结构: switch 和 break 语句》有讲过

当 switch 跳到某个位置之后,就会一直往下执行,比如说它满足了 case 常量表达式1 的要求之后会自动执行剩下的所有的语句和程序块,而无需判断是否满足前面所对应的 case 。所以如果只希执行某一个 case 后面的语句和程序块,还需要配合一个 break 语句,让代码在适当的位置跳出 switch

在循环体中,如果我们想要让程序在中途跳出循环,那么我们同样可以使用 break 语句来实现。执行 break 语句,直接跳出循环体。

  举个例子,如下是上次判断一个数是否是素数的代码

#include <stdio.h>

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 <stdio.h>

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 的时候跳出两层循环,将注释的部分去掉就可以了。

2. continue 语句

  还有一种情况是在满足某一种情况的时候,跳过本轮循环下面的语句,开始下一轮循环,可以使用 continue 语句。当使用 continue 语句的时候,循环体剩余的语句将会被忽略,开始下一次的循环。

  比如说下面这个例子

#include <stdio.h>

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 只是结束本轮循环,更新计数器之后,开始新的一轮循环。

3. while 语句与 for 语句

  经过《C语言 – 循环结构:for 语句和嵌套循环》可能会认为 while 语句与 for 语句的功能是相同的,但是实际上两者的执行过程是有区别的,它们的区别在于出现 continue 语句时,比如说下面的这段代码

#include <stdio.h>

int main()
{
	int i;
	for (i = 0; i < 100; i++){
		if (i % 2){
			continue;
		}
	}
	return 0;
}

虽然没有什么实质的功能,只是用来评测两种循环的效果,但是这段代码是可以顺利执行完毕的,但是如果我们将它改写为如下的 while 形式

#include <stdio.h>

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

欢迎大家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dugudaibo/article/details/82979416