C语言番外篇(3)------------>break、continue

看到我的封面图的时候,部分读者可能认为这和编程有什么关系呢?

实际上这个三个人指的是本篇文章有三个部分组成。

在之前的博客中我们提及到了while循环和for循环,在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for循环中的break和continue问题。

不知道while循环如何使用的可以参考:C语言(11)------------->while循环-CSDN博客

不知道for循环如何使用的可以参考:CSDN

一、while循环的break和continue

1.1while循环的break

在讲这个之前,我们使用一个例子回顾一下while循环的使用:

使用while循环打印1~10的数字:

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ",i);
		i++;
	}
	return 0;
}

在VS2019中的运行结果:

在中文中,break的含义是打破的意思。把它用在while循环中,是跳过循环,不管循环有多少次,只要break被执行循环就直接停止。

那我们什么时候使用break呢?当某件事情发生时,我们不想再循环时就可以使用break。

那如果在上面的例子中当i的数值为5时我们加上break呢,会出现什么情况呢?

代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)//避免少写一个等于号
			break;
		printf("%d ",i);
		i++;
	}
	return 0;
}

在VS2019中的运行结果:

我们从运行结果可以看到:

当i的数值等于5的时候,我们执行if控制的语句,也就是break语句,此时直接跳出循环,不在执行循环体里面的内容,也就是执行while大括号后面的return 0,所以打印到4的时候,我们就停下来了。我画了一幅草图,希望能够帮助到你。

那我们来看看加上break后的程序流程图:

我们可以看到使用break后会直接到结束的位置。

1.2while循环的continue

continue在中文的意思是持续的意思。它在C语言中又有什么作用呢?

continue的作用是跳过本次循环continue后边内容的代码,直接去判断部分。

具体是什么意思,我们来看一个例子。把上面1.1的例子中的break改成continue:

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)//避免少写一个等于号
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}

在VS2019中的运行结果:

结果是1 2 3 4,好像不是期待的1 2 3 4 5 6 7 8 9。为什么会是这样呢?

我们执行到i==4的时候,判断条件不成立,打印4,然后执行i++。循环判断i==5,<=10是成立的,此时往下面执行,到达if语句后,5==5成立,执行if语句所控制的部分,即continue语句。跳出此次循环,后面的printf函数和i++不执行,也就是i==5不变。下一次循环判断仍然满足条件,进入循环体,执行if语句控制的部分,又跳出循环,i还是5。如此循环往复,进入了死循环。

所以我们的光标会卡在4后面。

之前我的博客中提及到了while循环缺陷的部分,说了有不利于调整的缺点。到这里,不知道您对此是否有所领悟呢?

那我们来看看加上continue后的程序流程图:

加上一个continue后,跳出本次循环,再次进入判断条件,判断是否循环。

如果学会了,那我再把上面的代码修改一下,先不看运行结果,分析一下屏幕上打印的内容应该是什么。

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		i++;
		if (5 == i)//避免少写一个等于号
			continue;
		printf("%d ", i);
	}
	return 0;
}

在VS2019中的运行结果:

自己可以想一想为什么是这样,如果有疑问,欢迎再评论区提问。

二、for循环中的break和continue

2.1for循环的break

例子:打印1~10的数字

(1)未加入break前的for循环:

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ",i);
	}
	return 0;
}

在VS2019中的运行结果:

(2)加入break后的for循环:

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)//避免少写一个等于号
			break;
		printf("%d ",i);
	}
	return 0;
}

在VS2019中的运行结果:

为什么是这样呢?相信看了while循环的break的例子应该多少有些理解了。但是我还是解释一下:

那我们来看看加上break后的程序流程图:

2.2for循环的continue

若将2.1中的break改成continue又会出现什么呢?还会和while循环的情况一样吗?

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)//避免少写一个等于号
			continue;
		printf("%d ", i);
	}
	return 0;
}

在VS2019中的运行结果:

运行结果中,我们可以看到,并不会像while循环中进入到了死循环,为什么不会死循环呢?

因为这里的调整部分并不在continue后面,而是在for循环的调整部分。相信看到这个地方的你,对for循环为什么是优于while循环的有所理解了。

那我们来看看加上continue后的程序流程图:

使用continue后会跳过本次循环,进入for循环的调整部分,再次判断是否满足循环条件。

三、for循环的三个部分讲解

先给出结论:for循环的三个部分都可以省略。我们来看一段三个部分都省略的代码:

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	for (; ; )
	{
		printf("hello world\n");
	}
	return 0;
}

在VS2019中的运行结果:

如果只省略调整部分呢?

(1)初始条件不满足判断条件

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i=1 ; i<=10 ; )
	{
		printf("hello world\n");
	}
	return 0;
}

在VS2019中的运行结果:

(2)初始条件满足判断条件

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i != 1; )
	{
		printf("hello world\n");
	}
	return 0;
}

在VS2019中的运行结果:

省略了调整部分,就会和我们初始设置与判断条件有关。若初始条件是满足判断条件的,那么程序就会进入死循环。

那如果省略了判断部分呢?那就会默认为判断条件为真,条件成立,进入死循环。

参考代码:

cpp 复制代码
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; ; i++ )
	{
		printf("hello world\n");
	}
	return 0;
}

在VS2019中的运行结果:

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa8 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio