C语言——分支语句

news2025/5/24 14:05:16

在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。

目录

1.何为语句?

2.if语句

2.1 if语句的语法结构

2.2 else悬空

2.3 if的书写形式

3.switch语句

3.1 switch的语法结构

3.2 default子句


1.何为语句?

首先,我们要明白什么是语句。在C语言中,语句可以分为以下五类:

表达式语句(比如a = 6;)、函数调用语句(比如printf("%d",a);)、控制语句(分支语句就是其中一种)、复合语句(例如{x = 6;y = 4;z = x + y;printf("%d",z);})、空语句(只有一个分号)。

控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制(C语言支持顺序结构、选择结构和循环结构三种结构)。C语言共有9种控制语句,可大致分为以下三类:

1.分支语句,也叫条件判断语句:if、switch;

2.循环语句:do while语句、while语句、for语句;

3.转向语句:break语句、goto语句、continue语句、return语句。

今天要讲的就是控制语句中的分支语句,也就是if和switch的语法。

话不多说,我们开始吧!

2.if语句

2.1 if语句的语法结构

首先我们了解一下if语句的使用格式:

if (表达式)
		语句1;
	else
		语句2;
	//多分支
	if (表达式1)
		语句1;
	else if (表达式2)
		语句2;
	else
		语句3;
	return 0;

表达式的结果为真,则语句执行,在C语言中,0为假,非0即真。

现在我们来演示一下,实现对年龄的判断,18岁及以上就打印"成年人",18岁以下就打印"未成年",小于0则提示"输入有误"。具体代码如下:

#include<stdio.h>
//代码1
int main()
{
    //定义一个名为age的整型变量,
	int age = 0;
    //输入年龄
	scanf("%d", &age);
    //开始判断
	if (age >= 18)
		printf("成年人");
	else if (age < 0)
		printf("输入有误");
    //不是>=18也不是<0,那么这里的范围就应该是0到18啦
	else
		printf("未成年");
}

我们可以发现,每一个if语句后,都跟着一条语句,只要前面条件成立,那么这条语句就会被执行,那如果条件成立,我们要执行多条语句呢?我们又应该怎么写? 

我们可以根据上面的代码,再补充一下,具体如下:

#include<stdio.h>
//代码2
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
	{
		printf("%d岁", age);
		printf("是成年人");
	}
		
	else if (age < 0)
		printf("输入有误");
	else
	{
		printf("%d岁", age);
		printf("未成年");
	}
	return 0;
}

可以看到,不同于代码1,代码2用一对{}将if语句后的多条语句给括起来,这个代码块也就是上面所提到的复合语句,用一对{}括起来的多条语句。所以,当条件成立时需要执行多条语句时,需要把要执行的语句写入{}中,如果没有,那么条件成立时,if语句只会执行在它之后的第一条语句(but我实验了一下,程序直接报错,无法运行。)

事实上只执行一条语句的话,也可以选择使用{},可以让代码看起来更加容易阅读,逻辑更清晰,后面会提到if语句的书写形式,uu们可以比较一下。

2.2 else悬空

uu们可以看一下下面这段代码,大家认为运行结果会是什么呢?

#include<stdio.h>
//代码1
int main()
{
	int a = 0;
	int b = 1;
	if (a == 2)
		if (b == 1)
			printf("gg\n");
	else
		printf("dd\n");
	return 0;
}

当时在学这个的时候,我就踩坑啦,以为程序会打印出"dd";

事实上,这个程序的运行结果是什么都不打印。

为什么呢?我们来看一下代码2:

#include<stdio.h>
//代码2
int main()
{
	int a = 0;
	int b = 1;
	if (a == 2)
	{
		if (b == 1)
		{
			printf("gg\n");
		}
	}
		
	else
	{
		printf("dd\n");
	}
	return 0;
}

代码2的运行结果就是"dd"啦,阅读代码2,我们可以清晰地观察到不同if 和else语句之间的从属关系,而在代码1中,else应该是匹配它上面的if(b == 1)的,也就是执行if(b == 1)和else的前提是,if(a == 2)为真。因此当if(a == 2)为假时,下面所有的语句都不会被执行,程序自然就什么都不打印了。

从这两段代码的对比中我们可以学到,else是和离它最近的if相匹配的。

2.3 if的书写形式

#include<stdio.h>
//代码1
int main()
{
	int a = 0;
	if (a == 1) {
		printf("dd");
	}
	else {
		printf("gg");
	}	
}

//代码2
int main()
{
	int a = 0;
	if (1 == a)
	{
		printf("dd");
	}
	else
	{
		printf("gg");
	}
}

通过上面两段代码的对比,可以看到代码2的逻辑更加清晰,更容易读懂,且不容易出错。

不仅是if语句,在编写程序的时候,我们也要做到严谨、简洁的书写形式,必要时适量加入注释,方便后期重新阅读代码。

3.switch语句

switch语句常常使用于多分支的情况下,当你需要多个条件判断时,用if...else if...else if...else就显得有点冗杂且麻烦了,这时候就需要我们的switch语句发挥作用了。

3.1 switch的语法结构

同样,我们需要先了解一下switch语句的使用格式:

switch (变量表达式)
	{
		case (常量1):
			语句1;
        case (常量2):
            语句2;
		......
	}

不同于if判断真假,switch语句是通过判断变量表达式与其中一个case语句中的常量是否相符,相符时就执行这个case语句后面的语句,并依次执行后面所有case语句中的语句。

以上面代码为例,即当变量表达式的值等于常量1时,就会执行语句1,紧接着执行语句2。

但是如果我们只想执行语句1不想执行语句2呢?

很显然,这个逻辑并不能满足我们实现分支,所以,switch还需要搭配关键字break一起使用;

现在我们来写一个程序,输入1~7,对应输出周一到周日,代码如下:

#include<stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期日\n");
		break;
	}
	return 0;
}

假设现在输入3,程序开始运行,此时day = 3,switch找到和day = 3相等的case 3,开始执行case 3 后面的语句,即打印"星期三",紧接着执行break语句,跳出switch语句,程序结束。

运行结果会不会和我们想的一样呢?我们运行一下看看:

 运行结果和我们判断的一样,证明我们的思路是没问题的,为了让大家更清晰地感受到break语句在switch语句中的作用,我们现在改变一下需求,输入1~5,打印工作日,输入6或7,打印休息日,代码实现如下:

#include<stdio.h>

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;
	}
	return 0;
}

 假设输入1,此时day = 1,程序开始执行case1后的语句,但case1后是没有语句的,所以程序开始执行case2的语句,以此类推,程序会依次执行下去直到case5这里打印"工作日",然后执行break语句跳出switch语句,程序结束。

可以看到,break语句的作用就是将不同case下的语句划分为不同分支。

那么,如果我们输入的不是1~7的数字呢?

这里就引出了和switch语句配套使用的另一个关键字:default。

3.2 default子句

当switch变量表达式和所有case标签的常量都不相符时,switch就会跳过所有的case语句,程序不会报错,也不会终止。

如果我们不想忽略switch变量表达式和所有case标签的常量不匹配的情况,我们就可以在语句列表中增加一条default子句,这个default语句可以出现在语句列表的任意一个位置,当switch变量表达式的值和所有case标签的值不相符时,switch语句就会执行default子句,因此,每个switch语句中只能出现一条default子句。

还是以上面的例子作为示范,我们加入一条default子句,当输入的值不是1~7时,打印"输入有误!",具体代码如下:

#include<stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
//这里故意将default放到中间,是想告诉大家default子句是可以出现在语句列表任意一个位置的
//但我比较习惯放在结尾
    default:
		printf("输入有误!\n");
		break;
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	}
	return 0;
}

我们输入8,看一下运行结果:

 在每个switch语句中都放入一条default子句是一个好习惯,也可以在后面加一个break,这样更能体现程序逻辑上的严密性。

以上就是C语言分支语句的所有内容啦,事实上这些语句还能够嵌套调用,这就需要大家勤加练习,多刷题,熟练掌握语句的使用方法啦!

下期内容会给大家介绍一下C语言的循环语句,敬请期待咯^_^

如有错误,还请大佬们及时指出(salute)

如果你觉得这篇文章对你有帮助的话,麻烦动动小手为我点个赞哦OvO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绿盟二面面试题

5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39a6eab17cc0ed0fca5f0e4c979ce64bd112762def9ee7cf0112a7e76af&scene21#wechat_redirect 1. 原理深度&…

deepseek生成流程图

目录 Mermaid流程图需求询问框架交互显示流程图markdown在线网站 可能会出现的问题语法报错 在职场中&#xff0c;借助AI生成图表是提升效率的重要技能&#xff0c;本篇我们讲解如何使用deepseek生成流程图 Mermaid流程图 需求 学习太差劲了&#xff0c;我想要一个比较好的学…

大塔集团乔迁开新局 企业赋能贯全程

2025年4月15 日&#xff0c;在佛山市佛山大道北175号&#xff0c;大塔集团乔迁开业盛大启幕&#xff0c;业界目光聚焦于此。 点睛仪式 揭牌仪式 彩绸飘扬、嘉宾云集&#xff0c;现场气氛热烈非凡&#xff0c;这一标志性时刻&#xff0c;宣告着大塔集团正式踏上全新发展征程。 …

Spark-SQL核心编程(二)(三)

Spark-SQL核心编程&#xff08;二&#xff09; DSL 语法 DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL&#xff0c;使用 DSL 语法风格不必去创建临时视图了。 1.创建一个 DataFrame val d…

继承:(开始C++的进阶)

我们今天来学习C的进阶&#xff1a; 面向对象三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。 封装我们在前面已经学了&#xff0c;我们细细理解&#xff0c;我们的类的封装&#xff0c;迭代器的封装&#xff08;vector的迭代器可以是他的原生指针&#xff0c;li…

oracle数据库单个表空间达到32G后程序报错表空间不足问题排查、处理

oracle数据库单个表空间达到32G后程序报错表空间不足问题排查、处理 系统宕机tomcat日志报错表空间无法增长&#xff0c;排查发现oralce表空间文件到了32G。 通过AI查了下&#xff0c;“oracle是否支持表空间达到32G后&#xff0c;自动创建新的表空间文件” 答复是oralce不支…

人工智能——梯度提升决策树算法

目录 摘要 14 梯度提升决策树 14.1 本章工作任务 14.2 本章技能目标 14.3 本章简介 14.4 编程实战 14.5 本章总结 14.6 本章作业 本章已完结&#xff01; 摘要 本章实现的工作是&#xff1a;首先采用Python语言读取含有英语成绩、数学成绩以及学生所属类型的样本数据…

【leetcode hot 100 136】只出现一次的数字

解法一&#xff1a;&#xff08;异或XOR&#xff09;相同的数字出现两次则归零 class Solution {public int singleNumber(int[] nums) {int result 0;for(int num:nums){result ^ num;}return result;} }注意&#xff1a; 其他方法&#xff1a;HashList记录次数再查找数组&a…

QEMU学习之路(8)— ARM32通过u-boot 启动Linux

QEMU学习之路&#xff08;8&#xff09;— ARM32通过u-boot 启动Linux 一、前言 参考文章&#xff1a; Linux内核学习——内核的编译和启动 Linux 内核的编译和模拟执行 Linux内核运行——根文件系统 Linux 内核学习——使用 uboot 加载内核 二、构建Linux内核 1、获取Linu…

AgentOps - 帮助开发者构建、评估和监控 AI Agent

文章目录 一、关于 AgentOps二、关键集成 &#x1f50c;三、快速开始 ⌨️2行代码中的Session replays 首类开发者体验 四、集成 &#x1f9be;OpenAI Agents SDK &#x1f587;️CrewAI &#x1f6f6;AG2 &#x1f916;Camel AI &#x1f42a;Langchain &#x1f99c;&#x1…

leetcode 122. Best Time to Buy and Sell Stock II

题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样&#xff0c;详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次&#xff0c;因此如果第i天买入股票&#xff0c;买之前的金额肯定是初始金额…

【ROS】代价地图

【ROS】代价地图 前言代价地图&#xff08;Costmap&#xff09;概述代价地图的参数costmap_common_params.yaml 参数说明costmap_common_params.yaml 示例说明global_costmap.yaml 参数说明global_costmap.yaml 示例说明local_costmap.yaml 参数说明local_costmap.yaml 示例说明…

《Against The Achilles’ Heel: A Survey on Red Teaming for Generative Models》全文阅读

《Against The Achilles’ Heel: A Survey on Red Teaming for Generative Models》 突破阿基里斯之踵&#xff1a;生成模型红队对抗综述 摘要 生成模型正迅速流行并被整合到日常应用中&#xff0c;随着各种漏洞暴露&#xff0c;其安全使用引发担忧。鉴于此&#xff0c;红队…

datagrip连接mysql问题5.7.26

1.Case sensitivity: plainmixed, delimitedexac Remote host terminated the handshake. 区分大小写&#xff1a;plain混合&#xff0c;分隔exac 远程主机终止了握手。 原因:usessl 参数用于指定是否使用 SSL&#xff08;Secure Sockets Layer&#xff09;加密来保护数据传…

探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”

本文目录 一、引言二、Web Unlocker API 功能亮点三、Web Unlocker API 实战1.配置网页解锁器2.定位相关数据3.编写代码 四、Web Scraper API技术亮点 五、SERP API技术亮点 六、总结 一、引言 网页数据宛如一座蕴藏着无限价值的宝库&#xff0c;无论是企业洞察市场动态、制定…

【本地MinIO图床远程访问】Cpolar TCP隧道+PicGo插件,让MinIO图床一键触达

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言MinIO本地安装与配置cpolar 内网穿透PicGo 安装MinIO远程访问总结互动致谢参考目录…

Policy Gradient思想、REINFORCE算法,以及贪吃蛇小游戏(一)

文章目录 Policy Gradient思想论文REINFORCE算法论文Policy Gradient思想和REINFORCE算法的关系用一句人话解释什么是REINFORCE算法策略这个东西实在是太抽象了,它可以是一个什么我们能实际感受到的东西?你说的这个我理解了,但这个东西,我怎么优化?在一堆函数中,找到最优…

Profibus DP主站转modbusTCP网关与dp从站通讯案例

Profibus DP主站转modbusTCP网关与dp从站通讯案例 在当前工业自动化的浪潮中&#xff0c;不同协议之间的通讯转换成为了提升生产效率和实现设备互联的关键。Profibus DP作为一种广泛应用的现场总线技术&#xff0c;与Modbus TCP的结合&#xff0c;为工业自动化系统的集成带来了…

快速部署大模型 Openwebui + Ollama + deepSeek-R1模型

背景 本文主要快速部署一个带有web可交互界面的大模型的应用&#xff0c;主要用于开发测试节点&#xff0c;其中涉及到的三个组件为 open-webui Ollama deepSeek开放平台 首先 Ollama 是一个开源的本地化大模型部署工具,提供与OpenAI兼容的Api接口&#xff0c;可以快速的运…

H.265硬件视频编码器xk265代码阅读 - 帧内预测

源代码地址&#xff1a; https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值&#xff0c;每个mode_i对应…