【C生万物】C语言分支和循环语句

📚博客主页:爱敲代码的小杨.
✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录
- 1、if语句
- 1.1 if语句的语法格式:
- 1.2 if语句的执行流程
- 1.3 if ...else 语句
- 1.4 级联式if语句
- 1.5 “悬空else” 的问题
- 2、switch语句
- 3、while循环
- 3.1 while语句的格式
- 3.2 while语句的执行流程
- 3.3 while语句的实践
- 4、for循环
- 4.1 for语句的格式
- 4.2 for语句的执行流程
- 4.3 for语句的实践
- 4.4 for语句和while语句的对比
- 5、do...while循环
- 5.1 do...while语句的格式
- 5.2 do...while语句的执行流程
- 5.3 do...while语句的实践
- 6、break和continue
- 7、goto语句
1、if语句
if 语句允许程序通过测试表达式的值从两种选项中选择一种。
1.1 if语句的语法格式:
if(表达式)语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0表示假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行
1.2 if语句的执行流程

1.3 if …else 语句
语法格式:
if(表达式)语句;
else语句;
1.4 级联式if语句
编程时常常需要判断一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常时编写这类系列判定的最好方法。
例如:下面这个级联式if语句用来判定n是小于0、等于0、大于0
if(n<0)printf("%d小于0\n",n);
elseif(n==0)printf("%d等于0\n",n);elseprintf("%d大于0\n",n);
虽然第二个 if 语句式嵌套在第一个if语句内部的。通常不会对他对进行缩进,而是把每个else都与最初的 if 对齐:
if(n<0)printf("%d小于0\n",n);
else if(n==0)printf("%d等于0\n",n);
elseprintf("%d大于0\n",n);
级联式 if 语句独特的书写形式:
if(表达式)语句
else if(表达式)语句
else if(表达式)语句
...
else语句
1.5 “悬空else” 的问题
当 if 语句嵌套时,千万要当心著名的“悬空else”的问题。
思考下面这个例子:
#include <stdio.h>int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
程序运行结果是什么呢?
很多人认为 a = 0,不等于1,程序执行else子句,打印haha,但是你运行程序的时候,输出结果:什么都没有打印。

这就是悬空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");elseprintf("haha\n");}return 0;
}
或者如果我们希望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 语句默认都只控制一条语句,想要控制多条语句需要加上{},构成复合语句。
2、switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch 的语法格式:
switch(表达式)
{case 常量表达式:语句case 常量表达式:语句 ...case 常量表达式:语句 default :语句
}
switch 的组成部分:
- 控制表达式:
switch后面必须跟着圆括号括起来的整形表达式。C语言把字符当成整数来处理,因此在switch语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。 - 分支标号:每个分支的开头都有一个标号,格式如下:
case 常量表达式:
常量表达式很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10 也是常量表达式,但 n + 10 不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)
- 语句:每个分支标号的后边可以任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是
break语句。
C语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
default 的作用:
switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。
3、while循环
循环是重复执行其他语句(循环体)的一种语句。
3.1 while语句的格式
while(表达式)语句
3.2 while语句的执行流程

首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
3.3 while语句的实践
练习:在屏幕上打印1~10的值
代码:
#include<stdio.h>int main()
{int i = 1;while (i <= 10){printf("%d ", i);i++;}return 0;
}
运行结果:

4、for循环
4.1 for语句的格式
for(声明或者表达式1;表达式2;表达式3)语句
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
4.2 for语句的执行流程

首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行训话语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环
4.3 for语句的实践
练习:在屏幕上打印1~10的值
代码:
#include<stdio.h>int main()
{int i = 0;for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}
运行结果:

4.4 for语句和while语句的对比

5、do…while循环
5.1 do…while语句的格式
do
{语句
}while(表达式);
while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而do...while 循环则是先直接进入循环体,执行循环鱼护,然后在执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
5.2 do…while语句的执行流程

在do...while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是!=0,则继续循环,执行循环;判断表达式的结果==0,则循环结束。
所以在do...while 语句中循环体是至少执行一次的,这是do...while 循环比较特殊的地方。
5.3 do…while语句的实践
练习:在屏幕上打印1~10的值
代码:
#include<stdio.h>int main()
{int i = 1;do{printf("%d ", i);i++;} while (i<=10);return 0;
}
运行结果:

6、break和continue
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。
break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。continue的作用是跳出本次循环continue后边的代码
7、goto语句
C语言提供了一种非常特别的语法,就是goto 语句和跳转标号,goto 语句可以实现在同一个函数内跳转到设置好的标号处。
标号只是放置在语句开始处的标识符:
标识符: 语句
goto语句格式
goto 标识符;
例如:
#include<stdio.h>int main()
{printf("hehe\n");goto next;printf("haha\n");next:printf("跳过haha的打印\n");return 0;
}
运行结果:

goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以能不用尽量不去使用;但是goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto 就非常的方便了。
for(...)
{for(...){for(...){if(1)goto next;}}
}next://...
本来for 循环也使用break 跳出,但是break 只能跳出一次循环,这里就要用3个break 才可以跳出循环,所以这种情况使用goto语句就更快捷。

相关文章:
【C生万物】C语言分支和循环语句
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…...
Vue代理模式和Nginx反向代理(Vue代理部署不生效)
在使用axios时,经常会遇到跨域问题。为了解决跨域问题,可以在 vue.config.js 文件中配置代理: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {port: 7070,prox…...
C语言中的作用域与生命周期
作用域(scope)是程设计概念,通常来说,一段程序代码中所⽤到的名字并不总是有效的,而限定这个名字的可⽤性的代码范围就是这个名字的作用域。 局部变量的作用域是变量所在的局部范围。全局变量的作用域是整个工程&…...
MATLAB计算多边形质心/矩心
前言:不规则四边形的中心 不规则四边形的出心有多种定义,以下是最常见的三种: 1.重心:重心是四边形内部所有顶点连线交点的平均位置。可以通过求解四个顶点坐标的平均值来找到重心。 2.质心:质心是四边形内部所有质点…...
IP地址如何保护网络安全
面对网络攻击时,仅依靠常态化的网络安全防御系统已捉襟见肘,如联合使用IP地址数据可以形成多元化的安全解决方案,全面监控网络活动,发现潜在威胁,制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…...
考研数据结构笔记(3)
顺序表存储结构 存储结构顺序结构定义基本操作的实现静态分配问题 动态分配代码功能 顺序表的特点: 顺序表小结顺序表的插入删除插入删除小结 顺序表的查找按位查找按值查找小结 存储结构 顺序结构 定义 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列(每个数据元素…...
第二讲 数据结构 AcWing 827. 双链表
目录 双链表代码 && 思路 双链表 实现一个双链表,双链表初始为空,支持 5 种操作: 在最左侧插入一个数; 在最右侧插入一个数; 将第 k个插入的数删除; 在第 k 个插入的数左侧插入一个数;…...
假期作业 2月6号
一、填空题 1、一个类的头文件如下所示,num初始化值为5,程序产生对象T,且修改num为10,并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; public: Test(int); void show(); };…...
【wu-lazy-cloud-network】Java自动化内网穿透
项目介绍 wu-lazy-cloud-network 是一款基于(wu-framework-parent)孵化出的项目,内部使用Lazy ORM操作数据库,主要功能是网络穿透,对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 功能 1.内网…...
【C++】C++入门(二)
个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 缺省参数2.1 缺省参数概念2.2 缺省参数分类 3. 函数重载3.1 函数重载概念3.2 C支持函数重载的原理--名字修饰(name Mangling) 1. 前言 在前面一篇文章中简…...
6.electron之上下文隔离,预加载JS脚本
如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…...
【翻译】 Processing的安卓项目构建(译者用的是Android Studio)
原文链接:https://github.com/processing/processing-android/wiki/Building-Processing-for-Android,版本Apr 2, 2023 译者声明:这个文档是开源公开的,协议是GNU协议。译者自己得使用这个文档,所以才翻译的࿰…...
华为机考入门python3--(8)牛客8-合并表记录
分类:字典排序 知识点: 将输入转成int的列表 my_list list(map(int, input().strip().split( ))) 将列表转为元组 tuple(my_list) 访问元素为元组的列表 for first, second, third in my_list: 对字典进行排序 sorted(my_dict.items())…...
vue3-内置组件-KeepAlive
KeepAlive <KeepAlive> 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。 基本使用 默认情况下,一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时,会创建…...
RxJava Subject
目录 AsyncSubjectBehaviorSubjectPublishSubjectReplaySubjectSerializedSubjectUnicastSubject 在Rxjava中, Subject可以同时表示Observer和Observable, 允许从单个源到多个子观察者multiple child Observers。 除了 onSubscribe(io.reactivex.disposables.Dispos…...
[N-141]基于springboot,vue网上拍卖平台
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plusredi…...
新能源光伏发电设计全面解析
伴随碳达峰、碳中和“双碳”政策大力推行,以及新能源市场的利好,目前多个城市在大力推进光伏发电项目,本篇文章将详细介绍关于光伏发电设计的信息。 一、光伏发电概念 光伏发电是指利用太阳辐射能在太阳能电池板上产生的电能,通…...
踩坑实录(Third Day)
临近年关,同事们该回家的也都回家了,所以我对工作的欲望不是很强烈,所以就主要是自己学习了一下,在 B 站看看视频,自己敲代码,所以今天没遇到什么坑,但是可以分享一下之前踩到的两个坑。 此为第…...
Linux联网安装MySQL Server
yum安装 以下代码复制粘贴到控制台即可 yum list | grep mysql-server #查看可以下载的MySQLyum install -y mysql-server #安装MySQLmysql_secure_installation #引导安装 引导安装实例如下 systemctl enable mysqld 设置开机自动启动 systemctl sta…...
使用GDI画图片生成合成图片并调用打印机进行图片打印
使用GDI画图片生成合成图片并调用打印机进行图片打印 新建窗体应用程序PrinterDemo,将默认的Form1重命名为FormPrinter,添加对 Newtonsoft.Json.dll用于读写Json字符串 zxing.dll,zxing.presentation.dll用于生成条形码,二维码…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
