详解C语言之分支与循环语句

本文详细介绍了C语言中的分支语句(if,else,嵌套if,switch)以及循环语句(while,for,do...while),包括它们的语法结构、执行规则和常见应用场景,强调了break和continue在控制流程中的作用。


C语言是结构化的程序设计语言,有顺序结构、选择结构(分支结构)、循环结构。

1. 分支语句之if语句

1.1 if

if语句的语法形式如下:

if (表达式)
	语句;

if语句的执行规则如下:如果if括号里的表达式成立(为真),则执行下面的语句;如果if括号里的表达式不成立(为假),则不执行下面的语句。

注:在C语言中非0为真,0为假。

比如:

int main()
{
	int a = 1;
	if (a > 0)
		printf("a大于0\n");
	return 0;
}

a=1显然大于0,表达式成立,执行下面的语句,打印出结果 a大于0

再比如:

int main()
{
	int a = 1;
	if (a)
		printf("haha\n");
	return 0;
}

if括号里的表达式a为1,非0,那么就会执行下面的语句,屏幕上就会打印出 haha

1.2 else

一个非0数要么大于0,要么小于0。要判断这个数是大于0还是小于0,如果我们只使用if语句,代码如下:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
		printf("a是正数\n");
	if (a < 0)
		printf("a是负数\n");
	return 0;
}

这段代码可行,但需要判定两次条件。因为一个非0数如果不大于0的话,肯定是小于0,不需判定。因此,我们引入else语句
代码实现如下:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
		printf("a是正数\n");
	else
		printf("a是负数\n");
	return 0;
}

这里就构成了if…else…语句
语法形式如下:

if (表达式1)
	语句1else
    语句2;

如果if括号里的表达式成立(为真),则执行语句1,且不执行else语句;如果if括号里的表达式不成立(为假),则直接跳过语句1,进入else语句中的语句2。

注意:

  • if后面不要加分号,因为一个完整的分支语句还未结束,还有if下面的执行语句,else if、else语句亦是如此
  • 默认情况下if和else语句中都只控制一条语句,如果if或else需要控制两条或两条以上的语句,这时用{}将需要控制的语句括起来。

比如:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
	{
		printf("a大于0\n");
		printf("a是正数\n");
	}
	else
	{
		printf("a小于0\n");
		printf("a是负数\n");
	}
	return 0;
}

1.3 嵌套if

在实际应用情况中情况,一般不会只有一两种情况,这是只用if…else…就不够了。这时候就需要在else语句嵌套if了
基本语法形式如下:

if (表达式1)
	语句1;
else if (表达式2)
	语句2;
else
 	语句3;

比如:
输入一个数,判断是0,正数,负数

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
	{
		printf("a是正数\n");
	}
	else if(a < 0)//这里的if相当于嵌套在else语句中,形成嵌套结构
	{
		printf("a是负数\n");
	}
	else
	{
		printf("a是0\n");
	}
	return 0;
}

实际情况中,如果有很多种情况,就可以不断嵌套if语句
构成以下形式:

if (表达式1)
	语句1;
else if (表达式2)
	语句2;
else if (表达式3)
	语句3;
    ...
else
	语句;

1.4 悬空else问题

如果有多个if和else,可以记住一条规则,else总是与最接近的if匹配。
我们来看下面的代码

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

很多初学者会将第一个if和else匹配,导致认为结果是haha。其实不然,这段代码是我故意调整,使else与第一个if对齐。如果你将这段代码复制到VS上时,你会发现,VS会将else与第二个if对齐
在这里插入图片描述
这就是因为else是最接近的那个if匹配的(也就是第二个if),因此结果应该是hehe。

为了使代码的逻辑更加的清晰,我们往往会使用大括号将分支后的语句括起来
在这里插入图片描述

如果想打印出haha,我们可以对代码修改成如下:
在这里插入图片描述

由此可见,大括号对分支语句的重要性,因此我们以后在写代码的时候要注意括号的使用,这样可以使代码的可读性更高。

2. 循环语句

2.1 while语句

语法形式:

while (表达式)
	语句;

while语句的基本结构与if语句相似
两者的区别在于:1.if语句是判断表达式是否成立(为真),若为真则执行语句,若为假则跳过语句;while语句是判断表示式是否成立(为真),若为真则执行语句,执行完后再判断表示式是否成立(为真),若为真则再执行语句,不断循环,直至表达式不成立(为假)。

比如:

#include<stdio.h>

int main()
{
	int a = 2;
	while (a > 0)
	{
		printf("haha\n");
		a--;
	}
	return 0;
}

该循环执行两次,打印了两个haha。需要注意的是当while需要控制多条语句时,需要用大括号括起来,和if语句一样。

2.2 for循环

for循环的语法结构如下:

for (表达式1; 表达式2; 表达式3)
		语句;

表达式1是初始化表达式,用于循环变量的初始化,只执行一次。
表达式2是判断表达式,用于循环结束条件的判断。
表达式3是调整表达式,用与循环变量的调整。

执行流程如下:先对循环变量进行一次初始化,再判断循环条件是否满足,满足则执行语句,然后再执行表达式3,对循环变量进行调整,再判断表达式2是否满足,若满足则执行语句…依次循环,直至表达式2不成立(为假)。

比如:
在屏幕上打印0~10的值
在这里插入图片描述

2.3 for循环与while循环的比较

在这里插入图片描述
for和while都有初始化,判断,调整这三部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多时,while循环的三个部分就比较分散,所以从形式上for循环要更优一些,这也就是为什么三种循环结构中for循环使用的频率最高。

2.4 do…while循环

do…while循环的语法结构:

do
{
	语句;
} while (表达式); //注意这里有个分号

do…while循环执行流程:直接执行一次语句,然后再判断表达式是否成立(为真),若为真,则继续循环…直至表达不成立(为假)。
do…while循环与while循环和for循环不同的是第一次循环,do…while第一次循环是直接执行语句,再判断表达式;而while、for循环是判断后再进入循环。所以,do…while至少执行一次循环。

**比如:**在屏幕上打印0~10的值
在这里插入图片描述

3. break与continue语句

  • break的作用是终止break外的一层循环,继续往后执行
  • continue的作用是跳过循环continue后面的语句,且在while循环和for循环有所不同

3.1 循环中的break

while循环中的break语句举例:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f87fd2869e74b30aeb63da693d13324.png在这里插入图片描述
这段代码运行只有1 2 3 4,当i = 5 时,循环就终止了。

同样地,用for循环:
在这里插入图片描述

3.2 循环中的continue

while循环中的continue语句举例:
在这里插入图片描述
while语句中的continue是跳过continue后面的语句,跳到循环判断的地方,判断表达式是否成立,若成立(为真),再次进入循环。
这段代码当i=5时,执行continue语句,判定,进入循环,后续i一直为5,因此这段代码死循环

for循环中的continue语句举例:
在这里插入图片描述
for循环continue跳过后面的语句,进入的是for循环的调整表达式,再进入判断表达式,若表达式成立,则继续循环。
while循环和for循环中执行continue语句后进入的表达式不同,这是两者的区别。do…while循环的break语句、continue语句几乎和while一样,这里就不举例了,可以自行测试并体会。

4. 分支语句之switch语句

switch是一种特殊形式的if…else结构,用于判断条件有多个结果的情况。它把多重的else if 改成了更易用、可读性更好的形式。
switch的语法结构:

switch (expression)
{
	case value1:
		statement1;
	case value2:
		statement2;
	default:
		statement;
}

根据expression得到的不同的值,执行不同的case不同分支,如果找不到对应的值,那么就执行default分支。

注:

  • switch后的expression必须是整型表达式
  • case后的value必须是整形常量表达式

4.1 switch语句与if语句的比较

比如:求一个除3后的余数
先用if语句来写:

#include<stdio.h>

int main()
{
	int i = 0;
	scanf("%d", &i);
	if (i % 3 == 0)
	{
		printf("整除,余数为0\n");
	}
	else if (i % 3 == 1)
	{
		printf("余数是1\n");
	}
	else
	{
		printf("余数是2\n");
	}
	return 0;
}

再用switch语句来写:

#include<stdio.h>

int main()
{
	int i = 0;
	scanf("%d", &i);
	switch (i % 3)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

注意:

  1. case的后边的数字之间必须有一个空格
  2. 每一个case语句执行完后,需要加上break语句,才能跳出switch语句
  3. 每个case分支后需要控制多条语句时,一般情况不加大括号,加了也没错

4.2 switch语句中break

上面的代码如果不加break会怎么样呢?看如下图
在这里插入图片描述

我们首先输入7,7除3,余1,执行case 1,即打印余数是1,执行完case1后,代码继续往下走,执行case 2,也就会打印余数是2。所以,在switch语句的每一个case分支执行完后需要加上break,跳出switch语句

注:
在if else语句中,是不能直接用break和continue的。除非是在for循环中嵌套if else语句,可以加,但那也是循环语句的break与continue,对循环结构进行break和continue

4.3 switch语句中的default

在使用switch语句中,可能会碰到switch后的表达式无法与任何一个case匹配,这时就执行default语句

**比如:**输入1-5,输出工作日;输入6-7,打印休息日

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

当我们输入8时,会打印出输入错误。


end

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值