C语言分支循环语句详解

news/2024/5/10 9:39:24

分支和循环语句是什么

在我们写程序的时候,总会遇到想一直循环执行某种语句的时候,这时候我们就要使用一种语句叫循环语句,或者带一些判断条件的语句,在C语言中提供了像这些的循环语句和分支语句

if else 语句

这是一种判断语句,他的格式如下

if(判断条件)
{
程序内容
}else if(判断条件)//另一种情况
{
程序内容
}
else//最后一种情况
{
程序内容
}

首先进入if语句如果条件为真那么就执行if语句里面的内容,如果为假就看看else if如果这里为真就执行else if里面的语句,如果这里为假就直接进入最后一种情况else语句里面

注意:如果if ,else if ,else下面只有一条语句则不用打括号,如果有2条以上的语句(包括两条)就必须要打大括号,但这里建议不管几条都可以打上大括号,这样也方便阅读代码行与行之间隔的更开。这里的第二个else 后面的if与最后一个else形成了一个嵌套if语句。有了嵌套if语句就可以完成我们更加复杂的条件判断

我们来举一个例子;

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (age < 10){printf("儿童\n");}else if (age < 18){printf("青年\n");}else{printf("成年\n");}return 0;
}

这里就运用了判断条件来判断输入的年龄是儿童还是青年或者是成年

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

下面来再来看一个代码

# include<stdio.h>
int main()
{int a = 3;if (a > 5)if (a > 2)printf("hehe\n");elseprintf("hello\n");return 0;
}

这里我们会产生一个误解首先看第一个判断条件不成立,然后就看第二个else成立让后打印hello,但我们运行程序之后就会发现什么都没有打印出来,这是为什么呢,那是因为在这里我们排版的时候让else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印hello,但实际上但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。所以遇到这种情况我们可以这样记忆

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

改成这样就行了

# include<stdio.h>
int main()
{int a = 3;if (a > 5){if (a > 2){printf("hehe\n");}else{printf("hello\n");}}return 0;
}

这里就也说明了打大括号的好处在哪里

switch选择语句

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

switch (expression) {case value1: statementcase value2: statementdefault: statement
}

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

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

我们写一个代码看看

# include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);switch (n){case 1:printf("hehe\n");break;case 2:printf("haha\n");break;}return 0;
}

这里我们用switch来判断n输入的值,如果是1就打印hehe,如果是2就打印haha,如果我们不在每个case后面输入break会怎么样呢,下面来看看
在这里插入图片描述

最终会变成这个样子这是为什么呢?原因是
switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 2 中的语句。
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch(day){case 1case 2:case 3:case 4:case 5:printf("⼯作⽇\n");break;case 6:case 7:printf("休息⽇\n");break;}return 0;}

这段代码我们就没有在每个case后面使用break,照样完成我们判断日期是工作日还是休息日。
switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。
格式是这样的

switch (expression) {case value1: statementcase value2: statementdefault: statement}

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。
我们还是拿上面的代码来稍作调整

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch(day){case 1case 2:case 3:case 4:case 5:printf("⼯作⽇\n");break;case 6:case 7:printf("休息⽇\n");break;default:printf("输⼊错误,请重新输入\n");break;}return 0;}

switch语句中的case和default的顺序问题
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。根据个人情况来看

while循环

和前面两个语句相比这个就不一样了这个就不是选择语句而是循环语句了C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句,while 语句的语法结构和 if 语句⾮常相似。

while(表达式)语句;//如果循环体想包含更多的语句,可以加上⼤括号

我们来看看while语句到底是怎么用的,来画一个图看看
在这里插入图片描述

⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语
句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
下面我们来写一个程序看看;

# include<stdio.h>
int main()
{int n = 0;while (n <= 10){printf("%d ", n);n++;}return 0;
}

这里我们用while循环来打印出0到10的数字
同样我们也可以写一个判断一个数是几位数的程序

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);while(n)//当n不等于0时{printf("%d ", n%10);n /= 10;}return 0;}

for循环

他的语句是这样的

 for(表达式1; 表达式2; 表达式3)语句;//如果循环体想包含更多的语句,可以加上⼤括号

表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整

下面我们画个图看看
在这里插入图片描述
⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果
==0(为假),则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环
我们来实践一下

# include<stdio.h>
int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%d ", i);}return 0;
}

while和for的比较
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形
式上 for 循环要更优⼀些。

do while 循环

在循环语句中 do while 语句的使⽤最少,它的语法如下:

do语句;
while(表达式)

while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
在这里插入图片描述
在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的
结果是真!,则继续循环,执⾏循环语句;判断表达式的结果为假,则循环结束。所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。
我们来试试看
在屏幕上打印出0到10的值

#include <stdio.h>
int main()
{int i = 1;do{printf("%d ", i);i = i + 1;}while(i<=10);return 0;}

break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中
提供了 break 和 continue 两个关键字,就是应该到循环中的。
1,break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
2, continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

while循环中的break和continue

break举例

#include <stdio.h>
int main()
{int i = 1;while (i <= 10){if (i == 9)break;//当i等于9后,就执⾏break,循环就终⽌了就打印到8就结束了.printf("%d ", i);i = i + 1;}return 0;
}

在这里插入图片描述
打印了1,2,3,4,5,6,7,8后,当i等于9的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。
所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。
continue运用举例
continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏
下⼀次循环的判断。
上⾯的代码,如果把 break 换成 continue 会是什么结果呢?

#include <stdio.h>
int main()
{int i = 1;while (i <= 10){if (i == 9)continue;printf("%d ", i);i = i + 1;}return 0;
}

这点的continue当i = 9时就会跳过后面的i+1部分直接又来判断i==9又为真有跳过后面的内容这样i+1就一直到不了,就会陷入死循环。

for循环中的break和continue

break举例

#include <stdio.h>
int main()
{int i = 1;for(i=1; i<=10; i++){if(i == 6)break;printf("%d ", i);}return 0;}

在这里插入图片描述
continue举例

#include <stdio.h>
int main()
{int i = 1;for(i=1; i<=10; i++){if(i == 6)continue;printf("%d ", i);}return 0;}

在这里插入图片描述
这里我们发现这里和while的情况截然不同,那是由于我们while是无法进入到循环调整部分,而for却可以。

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调
整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。

do while循环中的break和continue

这里的使用情况和while里面是一模一样的,可以自行调用上面的while程序进行调试看看。

#include <stdio.h>
int main()
{int i = 1;do{if(i == 7)break;printf("%d ", i);i = i + 1;}while(i<=10);return 0;}
#include <stdio.h>
int main()
{int i = 1;do{if(i == 7)continue;printf("%d ", i);i = i + 1;}while(i<=10);return 0;}

通过上面的循环讲解,我们要学会合理的使用他这样可以达到事半功倍的效果!
如果本文有错误,欢迎指正!


http://www.mrgr.cn/p/43532074

相关文章

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

学习总结!

1.构造器&#xff1a; 构造器通常也叫构造方法、构造函数&#xff0c;构造器在每个项目中几乎无处不在。当你new一个对象时&#xff0c;就会调用构造器。构造器格式如下&#xff1a; [修饰符&#xff0c;比如public] 类名 (参数列表&#xff0c;可以没有参数){ //这里不能有r…

Unity PS5开发 天坑篇 之 URP管线与HDRP管线部署流程以及出包介绍04

目录 一, URP管线、HDRP管线下的Unity项目部署 1. PS5开发论坛关于Unity可支持的版本说明: 2. URP管线下的项目与部署 2.1 Build PS5 URP Project 2.2 运行画面 3. HDRP管线下的项目与部署 3.1 附上可以运行的画面: 4. PS5打包方式介绍 4.1 PC串流调试模式: Build Typ…

面试题--3.18

1. http与https的区别&#xff0c;以及https的认证过程及加密算法 &#xff1f; 区别&#xff1a; https协议需要到CA申请证书&#xff0c;一般免费证书较少&#xff0c;因而需要一定费用。 http是超文本传输协议&#xff0c;信息是明文传输&#xff0c;https则是具有安全性…

打造核心竞争力:高效Web系统数据中台的设计与实践_光点科技

在数字化的浪潮中&#xff0c;数据已经成为企业赖以生存和发展的核心资源。一个高效的Web系统数据中台&#xff0c;能够赋予企业在激烈的市场竞争中立于不败之地的能力。本文将深入探讨如何设计和实施一个能够提升企业数据管理水平和支持业务决策的高效数据中台架构。 数据中台…

接单收入超过主业!程序员必备的兼职接单平台汇总

这个月副业接单的款项到账了&#xff0c;由于接了个大单&#xff0c;这个月净收入5w&#xff0c;一下子副业收入超过了主业。不得不说&#xff0c;程序员接单确实是一条赚钱的新路子&#xff0c;都说节流不如开源&#xff0c;这下我是真的体会到了&#xff01; 今天&#xff0c…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

Camera subdev注册流程

参考资料: 极客笔记https://deepinout.com/camera-sensor-driver/camera-sensor-driver-sensor-subdev-register-flow.htmlCamera驱动模型:用户空间通过CSL协议层,才能访问到Camera subdev,/dev/v4l-subdevx都不是固定的 可以通过cat /sys/class/video4linux/v4l-subdevx/n…

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…

基于SpringBoot后端实现连接MySQL数据库并存贮数据

目录 一、什么是MySQL数据库 二、基于SpringBoot框架连接MySQL数据库 1、首先添加MySQL依赖&#xff1a; 2、配置数据库连接&#xff1a; 3、创建实体类&#xff1a; 4、创建Repository接口&#xff1a; 5、使用Repository&#xff1a; 三、编写业务SQL语句 1、使用Spring Data…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

FreeType Glyph Conventions 翻译(4) ——Kerning 字间距调整

原文地址 https://freetype.org/freetype2/docs/glyphs/glyphs-4.html 目录字间距调整对子 Kerning pairs应用字间距调整 Applying kerning The term kerning refers to specific information used to adjust the relative positions of successive glyphs in a string of text…

MHA高可用+VIP漂移

目录一、环境搭建1、关闭防火墙firewalld,selinux2、每台主机安装MySQL二、基于GTID的主从复制1、修改/etc/my.cnf文件2、检查GTID状态3、配置主从复制4、从库设置三、部署MHA1、准备环境(所有节点)2、部署管理节点(可以部署在任何机器上)3、配置ssh信任4、启动测试(mana…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读&#xff1a; 不要安装iOS-Tagent &#xff0c;安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本&#xff0c;安装完…

计算机复试面试问答准备(未完)

目录 1、理解多态性2、怎么逆置⼀个链表3、顺序表和链表的区别4、树的存储结构5、什么是哈夫曼树&#xff1f;简述哈夫曼树的构造过程。介绍哈夫曼树的特性。6、哈夫曼编码的编码和解码过程7、图的遍历方式8、图的存储方式9、最小生成树10、迪杰斯特拉算法11、佛洛依德算法12、…

逆向中常见的加密算法

逆向中常见的加密算法 1.Base64 1) 原理与特征: ​ a.原理:将3个byte(即38=24bit)切割为46,然后根据6bit表示的数字在base64表(64byte的表)寻找对应的值;如果待加密字符串长度不为3的整数,则在末尾处补0对齐,其中0对应的字符为=。 ​ b.特征:在反汇编代码中会出现0x…

Flutter逆向

环境配置(Blutter)及使用 参考 [原创]flutter逆向 ACTF native app-Android安全-看雪-安全社区|安全招聘|kanxue.com 其中在编译过程中遇到 -- Configuring done (2.5s) -- Generating done (0.0s) -- Build files have been written to: E:/blutter/build/blutter_dartvm3.4…

创新指南|如何将人工智能应用于未来的创新管理——并不断付诸实践

ChatGPT 的推出加剧了围绕人工智能的炒作&#xff0c;现在我们看到了前所未有的巨大进展。对于我们这些热衷于创新的人来说&#xff0c;这是一个激动人心的时刻。他们正在共同采取措施&#xff0c;充分利用人工智能进行创新管理。本文将阐述人工智能能为创新管理做什么&#xf…

文件包含一-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

演示案例&#xff1a; 文件包含-原理&分类&利用&修复黑盒利用-VULWEB-有无包含文件白盒利用-CTFSHOW-伪协议玩法 #文件包含-原理&分类&利用&修复 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c…

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…