当前位置: 首页 > article >正文

C语言——分支语句

在现实生活中,我们经常会遇到作出选择和判断的时候,在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啦elseprintf("未成年");
}

我们可以发现,每一个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");elseprintf("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

相关文章:

C语言——分支语句

在现实生活中&#xff0c;我们经常会遇到作出选择和判断的时候&#xff0c;在C语言中也同样要面临作出选择和判断的时候&#xff0c;所以今天&#xff0c;就让我们一起来了解一下&#xff0c;C语言是如何作出选择判断的。 目录 1.何为语句&#xff1f; 2.if语句 2.1 if语句的…...

绿盟二面面试题

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;我想要一个比较好的学…...

界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

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

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

新闻业务--草稿箱

本人之前写的侧边栏渲染有点问题&#xff0c;超级管理员和其他的不兼容&#xff0c;所以修改了一下SideMenu&#xff1a; import React, { useState, useEffect } fromreact; import { Layout, Menu } from antd; import { useNavigate } fromreact-router-dom; import axios …...

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

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

Spring Boot整合Kafka的详细步骤

1. 安装Kafka 下载Kafka&#xff1a;从Kafka官网下载最新版本的Kafka。 解压并启动&#xff1a; 解压Kafka文件后&#xff0c;进入bin目录。 启动ZooKeeper&#xff1a;./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka&#xff1a;./kafka-server-…...

【EI/Scopus顶会矩阵】2025年5-6月涵盖统计建模、数智转型、信息工程、数字系统、自动化系统领域,硕博生执笔未来!

【EI/Scopus顶会矩阵】2025年5-6月涵盖统计建模、数智转型、信息工程、数字系统、自动化系统领域&#xff0c;硕博生执笔未来&#xff01; 【EI/Scopus顶会矩阵】2025年5-6月涵盖统计建模、数智转型、信息工程、数字系统、自动化系统领域&#xff0c;硕博生执笔未来&#xff0…...

Kubernetes 节点摘除指南

目录 一、安全摘除节点的标准流程 1. 确认节点名称及状态 2. 标记节点为不可调度 3. 排空&#xff08;Drain&#xff09;节点 4. 删除节点 二、验证节点是否成功摘除 1. 检查节点列表 2. 检查节点详细信息 3. 验证 Pod 状态 三、彻底清理节点&#xff08;可选&#xf…...

ReliefF 的原理

&#x1f31f; ReliefF 是什么&#xff1f; ReliefF 是一种“基于邻居差异”的特征选择方法&#xff0c;用来评估每个特征对分类任务的贡献大小。 它的核心问题是&#xff1a; “我怎么知道某个特征是不是重要&#xff1f;是不是有能力把不同类别的数据区分开&#xff1f;” 而…...

继承:(开始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语言读取含有英语成绩、数学成绩以及学生所属类型的样本数据…...

数据结构学习笔记 :基本概念、算法特性与线性表实现

目录 数据的逻辑结构数据的物理结构算法的五大特性好的算法目标时间复杂度与空间复杂度线性表的顺序存储&#xff08;顺序表&#xff09; 6.1 静态分配 6.2 动态分配 6.3 基本操作及时间复杂度 一、数据的逻辑结构 数据的逻辑结构描述数据元素之间的逻辑关系&#xff0c;分为…...

【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;加密来保护数据传…...

文件内容课堂总结

Spark-SQL连接Hive Apache Hive是Hadoop上的SQL引擎&#xff0c;Spark SQL编译时可选择是否包含Hive支持。包含Hive支持的版本支持Hive表访问、UDF及HQL。生产环境推荐编译时引入Hive支持。 内嵌Hive 直接使用无需配置&#xff0c;但生产环境极少采用。 外部Hive 需完成以下配置…...

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

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

AF3 create_alignment_db_sharded脚本process_chunk函数解读

AlphaFold3 create_alignment_db_sharded 脚本在源代码的scripts/alignment_db_scripts文件夹下。该脚本中的 process_chunk 函数通过调用 read_chain_dir 函数,读取每个链的多序列比对(MSA)文件并整理成统一格式的字典结构chunk_data 返回。 函数功能: read_chain_dir:读…...

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

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

PyTorch的benchmark模块

PyTorch的benchmark模块主要用于性能测试和优化&#xff0c;包含核心工具库和预置测试项目两大部分。以下是其核心功能与使用方法的详细介绍&#xff1a; 1. 核心工具&#xff1a;torch.utils.benchmark 这是PyTorch内置的性能测量工具&#xff0c;主要用于代码片段的执行时间…...

Spring Boot 参数校验 Validation 终极指南

1. 概述 Spring Validation 基于 JSR-303&#xff08;Bean Validation&#xff09;规范&#xff0c;通过Validated注解实现声明式校验。核心优势&#xff1a; 零侵入性&#xff1a;基于 AOP 实现方法拦截校验规范统一&#xff1a;兼容 Bean Validation 标准注解功能扩展&…...

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

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

Angular 框架详解:从入门到进阶

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今快速发展的 Web 开发领域&#xff0c;Angular 作为 Google 主导的企业级前端框架&#xff0c;以其完整的解决方案、强大的类型系统和丰富的生态系统&#xff0c;成为构建大型复杂应用的首选。不同于其他渐进式框架&#xff0c;An…...