【C语言】分支与循环(上)

前言:C语言是由顺序结构、选择结构、循环结构组成的结构化的程序设计语言。 那C语言是如何设计和实现这些结构的呢?话不多说,马上开始。

三种结构如图所示:

我们可以使用 if else语句、 switch语句 来实现选择(分支)结构,使用for 、 while 、 do while 来实现循环结构。

ps:本篇将先总结分支结构的知识,循环结构留到(下)篇。

看完觉得有帮助的话记得点赞收藏加关注哦~

目录

一、关系、条件、逻辑操作符

 二、if else 语句

三、switch语句

四、分支结构小练习:判断闰年


首先补充分支与循环必备操作符

一、关系、条件、逻辑操作符

(1)关系操作符:

C语⾔⽤于⽐较的表达式,称为“关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个。

>:⼤于运算符
<:⼩于运算符
>=: ⼤于等于运算符
<=:⼩于等于运算符
==: 相等运算符
!=: 不相等运算符

用法:用于比较两个值的大小或相等性,结果通常返回0或1,表示真假。

  • eg:20<25是正确的,结果返回1;25<20是错误的,结果返回0。

(2)条件操作符:

条件操作符需要接受三个参数,因此又叫三目操作符。形式如下(exp是表达式expression的缩写):

 exp1 ? exp2 : exp3

用法:如果exp1为真, exp2计算,计算的结果是整个表达式的结果;如果exp1为假, exp3计算,计算的结果是整个表达式的结果。

  • eg:1<2?1:0 exp1是1<2,结果为真,计算exp2,结果是本身。因此这个表达式最终的结果就是exp2的结果1。

(3)逻辑运算符

提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

! :逻辑取反运算符(改变单个表达式的真假)。

&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

  • eg:!0为非零表示真,1&&0为假,1||0为真。

 二、if else 语句

(1)结构:

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

 执行流程:

  • step1:判断if中表达式的真假。
  • step2:表达式为真➡执行if中的语句1,跳过else。
  • step3:表达式为假➡跳过if,直接执行else中的语句2。

tips:上面的结构仅适用于单语句的情况,因为if和else只能控制一条语句,当分支中包含多条语句时要用大括号{}将多条语句括起来形成代码块

if(表达式)
{语句1;语句3;
}
else
{语句3;语句4;
}

 先看一个问题:输⼊⼀个分数,>=60分就输出:及格,<=60分就输出:不及格。

下面三种写法都可以解决这个问题

int score=0;
scanf("%d",&score);//输入一个成绩①if(score>=60)printf("及格");elseprintf("不及格");②if(score>=60)printf("及格");if(score<=60)printf("不及格");③if(score>=60)printf("及格");else if(score<=60)//嵌套ifprintf("不及格");

(2)嵌套if(else if)

在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断

#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num > 0)printf("输⼊的数字是正数\n");else if(num < 0)                     printf("输⼊的数字是负数\n");//这⾥的if 相当于嵌套在else语句中,形成了嵌套结构elseprintf("输⼊的数字是0\n");return 0;
}

(3)悬空else问题

先看这样一段代码:

#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("11\n");elseprintf("22\n");return 0;
}

大家觉得结果输出什么呢? 

小飞在初学阶段看到这段代码时本能的以为结果应该打印11,但实际上什么也不输出。

为什么会这样呢?这就是悬空else问题。分析如下:

在编写代码时,如果遇到多个if和else语句。需要注意一个规则:else总是与最接近的if匹配。有时候,代码的排版可能会让人产生误解,比如上面的else与第一个if对齐,从而误以为当第一个if条件不成立时,会执行else子句。但实际上,else是和第二个最近的if语句匹配,形成嵌套的if else语句。如果第一个if条件不成立,那么嵌套的if和else语句根本就没有机会执行,因此最终可能什么都不会打印。

为了让代码更容易理解,我们应该调整代码块(添加大括号),使else与其真正匹配的if语句关系更加清晰。

#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2)printf("11\n");}else{printf("22\n");}return 0;
}

带上适当的⼤括号形成代码块,代码的逻辑就会更加的清晰,所以以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。


三、switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch语句可以看作是⼀种特殊形式的if else语句,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。

(1)结构:

switch (表达式) 
{case value1:语句1;case value2: 语句2;default: 语句3;
}

上⾯结构中,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。
注意:

  • switch 后的(表达式)必须是整型表达式(可以是数值,也可以是表达式,如a+b,a,b均是变量)。
  • case 后的value值,必须是整形常量表达式(只能是数值,如1、2)。
  • case 和后边的数字之间必须有空格

(2)break和default

①break

每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句

eg:

写一个输入⼀个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;
}

当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。 

比如当判断星期几是工作日还是休息日时,我们可以只在星期五和星期日时写break,这样在遇到星期1~5时因为没有break 语句,代码会继续往下执⾏直到最后一个满足工作日的星期跳出。

#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;
}

②default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。switch 后边的表达式结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句
就⽐如上面打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,即可:

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

tips:switch语句中的case和default无顺序要求,只要顺序是满⾜实际需求的就可以。不过习惯把 default ⼦句放在最后处理。


四、分支结构小练习:判断闰年

输⼊⼀个年份year,判断year是否是闰年?

闰年判断的规则:
能被4整除并且不能被100整除是闰年,即满足year%4==0 && year%100!=0
能被400整除是闰年,即满足year%400==0

参考代码:

#include <stdio.h>
int main()
{int year = 0;scanf("%d", &year);if(year%4==0 && year%100!=0)printf("是闰年\n");else if(year%400==0)printf("是闰年\n");return 0;
}

 结语:非常感谢耐心看到这里的小伙伴,本文主要讲了分支与循环中的分支结构,它们是代码中的重要组成成分,是构建任何复杂结构的基石。下期主要围绕循环结构展开。本篇文章到此结束,我们下期再见!

如果上述内容对您有帮助的话,还请点赞收藏✿

如果发现内容有误,还请给予指正,十分感谢:>

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

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

相关文章

一次与chatgpt关于VO的深入讨论。

我&#xff1a; {"usageRate":50,"projectInfo":[{"productName":"长江一号","deviceInfo":[{"deviceName":"AA","num":10},{"deviceName":"BB","num":3}]},…

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点&#xff1f; 开发模式和环境搭建&#xff1a; 注册接口 1.Lombok 2.开发流程 1.controller层&#xff0c;这个层会指明访问路径和要执行的逻辑&#xff1a; 2.我们把返回结果根据接口文档包装成一个类result&a…

docker save如何迁移镜像更节省空间?

文章目录 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间&#xff1f;空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候&#xff0c;往往会碰到基础镜像相同的很多镜像需要迁移&…

全新升级 | Built For You Spring ‘25 发布,Fin 智能客服实现新突破!

图像识别、语音交互、任务自动化&#xff0c;立即体验智能客服蜕变&#xff01; 上周&#xff0c;Intercom 举办了 Built For You Spring 25 发布会&#xff0c;正式揭晓了 AI Agent Fin 的一系列令人振奋的更新。Fin 正在以前所未有的速度革新客户支持模式——它已经成功解决了…

需求导向的K8S网络原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近发现自己似乎从来没学明白过Kubernetes网络通信方案&#xff0c;特开一贴复习总结一下。 在k8s中&#xff0c;每个 Pod 都拥有一个独立的 IP 地址&#xff0c;而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否允许在同一个 Node&#xff08;宿…

Vulnhub:Digitalword.local: FALL靶机渗透

将靶机按照图中连接方式打开&#xff0c;fall在virtualBox中打开 信息收集 扫描得ip arp-scan -l 扫描端口 nmap -A -T4 -sV -p- 扫描目录 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一个一个…

4、网工软考—VLAN配置—hybird配置

1、实验环境搭建&#xff1a; 2、实验过程 SW1&#xff1a; 先创建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的标签 …

【OCR】技术

OCR图像识别 一、OCR是什么二、Python中如何实现OCR1.简单应用 三、OCR的核心步骤1.​图像预处理​&#xff08;提高识别准确率&#xff09;2.​文字识别3.​输出结果 四、OCR到的应用场景五、注意事项六、扩展学习 此贴用来更新在工作中遇到的一些图片解析内容 一、OCR是什么 …

深入理解 dispatchEvent:前端事件触发的艺术

dispatchEvent 是 DOM 元素的一个方法&#xff0c;用于手动触发/派发一个事件。这个方法允许开发者以编程方式触发事件&#xff0c;而不是等待用户交互或浏览器自动触发。 1.基本概念 作用&#xff1a;dispatchEvent 用于在指定的 DOM 节点上触发一个事件 使用场景&#xff1…

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…

深入解析 JSON-RPC:从基础到高级应用(附调用示例)

在当今的软件开发领域&#xff0c;远程过程调用&#xff08;RPC&#xff09;技术是实现分布式系统间通信的关键手段之一。JSON-RPC&#xff0c;作为一种基于 JSON 数据格式的轻量级 RPC 协议&#xff0c;因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概…

抽象代数:群论

系列笔记为本学期上抽象代数课整理的&#xff0c;持续更新。 群的相关定义 群的定义 群是一个带有满足结合律、单位元、逆元的二元运算的集合&#xff0c;记作 ( G , ⋅ ) \left({G, \cdot}\right) (G,⋅)。若群运算满足结合律&#xff0c;则该集合构成半群。如果该半群中含…

线程同步——读写锁

Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁&#xff08;Read-Write Lock&#xff09;&#xff0c;也常被称为共享-独占锁&#xff08;Shared-Exclusive Lock&a…

全面解析PRN文件:从原理到可视化的完整指南 【标签打印】

文章目录 一、PRN文件概述二、PRN文件结构深度解析2.1 文件头配置2.1 绘图指令详解2.3 文本处理方案2.4 条码/二维码实现2.5 RFID指令集 三、实战&#xff1a;PRN可视化工具开发3.1 基于Canvas的实现方案3.2 坐标转换关键算法 四、常见问题解决方案4.1 内容偏移问题4.2 中文乱码…

C++:函数(通识版)

一、函数的基础 1.什么是函数&#xff1f;&#xff08;独立的功能单位&#xff09; 函数是C中封装代码逻辑的基本单元&#xff0c;用于执行特定任务。 作用&#xff1a;代码复用、模块化、提高可读性。 2、函数的基本结构 返回类型 函数名(参数列表) {// 函数体return 返回值…

sql注入语句学习

说明 注入漏洞作为登顶过web十大漏洞多次的漏洞&#xff0c;危害性不言而喻&#xff0c;其中sql注入就是注入漏洞常用的手段。其形成的原因是由于web在接收传参数据时&#xff0c;对数据的过滤不够严格&#xff0c;将其带入到数据库查询中&#xff0c;导致用户可以通过传参一些…

云钥科技多通道工业相机解决方案设计

项目应用场景分析与需求挑战 1. 应用场景 ‌目标领域‌&#xff1a;工业自动化检测&#xff08;如精密零件尺寸测量、表面缺陷检测&#xff09;、3D立体视觉&#xff08;如物体建模、位姿识别&#xff09;、动态运动追踪&#xff08;如高速生产线监控&#xff09;等。 ‌核心…

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…

VMware 安装 Ubuntu 实战分享

VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件&#xff0c;广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu&#xff0c;并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统&#xff1a;Windo…