【C语言初阶】探索编程基础:深入理解分支与循环语句的奥秘
📝个人主页🌹:Eternity._
⏩收录专栏⏪:C语言 “ 登神长阶 ”
🤡往期回顾🤡:C语言入门
🌹🌹期待您的关注 🌹🌹
❀分支与循环语句
- 📒1. 什么是语句?
- 📜2. 分支语句
- 🔄if 语句
- 🍁else 的匹配
- 🍂if 书写形式
- 💬switch 语句
- 🎩switch中 break
- 🎈default子句
- 📚3. 循环语句
- 🧩while 循环
- 🌞while中 break
- 🌙while中 continue
- 🧩for 循环
- ⛰️break和continue在for循环中
- 🏞️for语句的循环控制变量
- 🌄for循环和while循环
- 🧩do while 循环
- 🌄do while循环中的break和continue
- 📝4. goto语句
- 📖5. 总结
前言: 在编程的世界里,构建程序的基石不仅仅是数据的表示与处理,更在于如何根据条件做出选择,以及如何重复执行特定的代码块以完成任务。这正是分支语句(如if-else、switch等)和循环语句(如for、while、do-while等)大放异彩的舞台。它们如同编程语言的导航员和动力源泉,引领着代码逻辑在复杂的任务中穿梭前行,实现高效、灵活的程序逻辑控制
分支语句: 让我们能够基于不同的条件执行不同的代码块,它们如同决策树上的分叉,每个分叉都代表了一个可能的路径,根据条件判断的结果选择最合适的路径继续执行。这种能力使得程序能够根据用户输入、系统状态或计算结果等外部条件灵活地调整其行为,从而应对各种复杂多变的场景
循环语句: 是重复执行某段代码的强大工具。无论是需要遍历数组、处理大量数据、还是执行周期性任务,循环语句都能以简洁高效的方式完成任务。它们通过设定循环条件和循环体,使得程序能够在满足条件的情况下不断重复执行特定的操作,直至条件不再满足为止。这种能力极大地提高了程序的自动化程度和执行效率
因此,掌握分支和循环语句是成为一名合格程序员不可或缺的一步 。它们不仅是构建程序逻辑的基本单元,更是实现复杂功能和优化程序性能的关键所在。在接下来的内容中,我们将深入探讨这两种语句的工作原理、语法规则以及实际应用场景,帮助大家更好地理解并灵活运用它们来编写高效、可靠的程序代码
让我们一同踏上这段充满挑战与收获的C语言分支与循环语句之旅吧!
📒1. 什么是语句?
C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
我们今天介绍的是控制语句:
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成
控制语句可分为以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句
📜2. 分支语句
分支语句(Branch Statements)在编程中扮演着至关重要的角色,它们允许程序根据特定的条件执行不同的代码块。这种能力使得程序能够处理不同的输入、状态或计算结果,从而以灵活和动态的方式响应各种情况
我们在前两节入门时简单提到过
🔄if 语句
if 语句代码示例:
// 语法结构:
if(表达式)语句1;
else语句2;//多分支
if(表达式1)语句1;
else if(表达式2)语句2;
else语句3;
在 if 语句
中,我们规定如果表达式的结果为真,则语句执行
注意: 在C语言中0表示假,非0表示真
如果表达式的结果为真,我们想要执行多条指令就需要用 { }
将指令括起来代表一个代码块
if(表达式1)
{指令1;指令2;......
}
else if(表达式2)
{指令3;指令4;......
}
else
{指令5;......
}
🍁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;
}
我想大部分人以为会输出haha
,但是实际它什么都不会输出,因此我们要将代码写规范
因为:
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 书写形式
//代码1
if (condition) {return x;
}
return y;//代码2
if(condition)
{return x;
}
else
{return y;
}//代码3
int num = 1;
if(num == 5)
{printf("hehe\n");
}//代码4
int num = 1;
if(5 == num)
{printf("hehe\n");
}
代码2和代码4更好,逻辑更加清晰,不容易出错,书写代码3时,如果疏忽少了一个=
那么结果将有很大差异
💬switch 语句
🎩switch中 break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支
switch代码示例:
#include <stdio.h>
int main()
{int day = 1;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语句 的实际效果是把语句列表划分为不同的分支部分
如果我们想 输入1-5,输出的是“weekday”; 输入6-7,输出“weekend”,我们可以用 break 来划分
int main()
{int day = 3;switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}
注意:建议在最后一个 case 语句的后面加上一条 break语句,避免出现在以前的最后一个 case 语句后面忘了添加 break语句
🎈default子句
如果表达的值与所有的case标签的值都不匹配的话,所有的语句都被跳过。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果我们想在不匹配所有标签的表达式的值时让程序输出特定语句,我们可以在语句列表中增加一条default子句,在里面加入特定语句
default:......break;
注意:
- 写在任何一个 case 标签可以出现的位置
- 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句
- 它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句
建议在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break
📚3. 循环语句
循环语句是编程中非常重要的一部分,它们允许程序重复执行一段代码块直到满足某个条件为止。循环语句可以分为几种不同的类型,但最常见的是for循环、while循环和do-while循环
🧩while 循环
🌞while中 break
int main()
{int i = 1;while (i <= 10){if (i == 5)break;printf("%d ", i);// 这里输出的是 1,2,3,4i = i + 1;}return 0;
}
break在while循环中的作用:
- 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环
- 所以:while中的break是用于永久终止循环的
🌙while中 continue
int main()
{int i = 1;while (i <= 10){i = i + 1;if (i == 5)continue;printf("%d ", i);// 这里输出的是 2,3,4,6,7,8,9,10,11}return 0;
}
continue在while循环中的作用就是:
- continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断
🧩for 循环
for 循环代码示例:
for(表达式1; 表达式2; 表达式3)循环语句;
- 表达式1:为初始化部分,用于初始化循环变量的
- 表达式2:为条件判断部分,用于判断循环时候终止
- 表达式3:为调整部分,用于循环条件的调整
for 循环的使用代码示例:
// 打印 1-10的数字
int main()
{int i = 0;//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}
for循环的执行流程图:
⛰️break和continue在for循环中
for循环中也可以出现break和continue,他们的意义和在while循环中是一样的
// 代码1
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)break;printf("%d ", i);}return 0;
}// 代码2
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)continue;printf("%d ", i);}return 0;
}
🏞️for语句的循环控制变量
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0;
// 前闭后开的写法
for(i=0; i<10; i++)
{// 语句......
}
-注意: for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题
for(;;)
{......
}
🌄for循环和while循环
代码对比:
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{printf("hehe\n");i = i+1;//调整部分
}//实现相同的功能,使用while
for(i=1; i<=10; i++)
{printf("hehe\n");
}
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,比较分散,这样查找修改就不够集中和方便。
所以,for循环的风格更胜一筹;for循环使用的频率也最高,我本人也比较喜欢用for循环(嘻嘻)
🧩do while 循环
do while 循环代码示例:
do
{循环语句;
}while(表达式);
do while循环的执行流程图:
注意: 循环至少执行一次
int main()
{int i = 1;do{printf("%d ", i);i=i+1;}while(i<=10);return 0;
}
🌄do while循环中的break和continue
总体来说和之前差不太多
代码示例:
// 代码1
int main()
{int i = 1;do{if(5 == i)break;printf("%d ", i);i=i+1;}while(i<=10);return 0;
}// 代码2
int main()
{int i = 1;do{if(5 == i)continue;printf("%d ", i);i=i+1;}while(i<=10);
return 0;
}
📝4. goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上
goto语句
是没有必要的,实践中没有goto语句
也可以很容易的写出代码。但是某些场合下goto语句
还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环
goto语句代码示例:
for(...)for(...){for(...){if(disaster)goto error;}}
.......
error:if(disaster)// 处理错误情况
这里来介绍一个幽默小程序 -> 关机程序
关机程序代码示例:
// goto语句
#include <stdio.h>
int main()
{char input[10] = {0};system("shutdown -s -t 60");
again:printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");scanf("%s", input);if(0 == strcmp(input, "我是猪")){system("shutdown -a");}else{goto again;}return 0;
}// 循环语句
#include <stdio.h>
#include <stdlib.h>
int main()
{char input[10] = {0};system("shutdown -s -t 60");while(1){printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");scanf("%s", input);if(0 == strcmp(input, "我是猪")){system("shutdown -a");break;}}return 0;
}
📖5. 总结
在编程的浩瀚宇宙中,分支与循环语句犹如夜空中最亮的星辰,指引着程序逻辑的方向,赋予了代码以生命与智慧。它们不仅是编程语言中的基础构件,更是实现复杂逻辑、优化算法、以及构建动态交互体验的关键所在
分支语句让我们学会了如何在程序中做出决策,根据不同的条件执行不同的代码路径。这种能力让我们的程序更加智能,能够处理各种复杂的场景和变化。而循环语句则赋予了我们重复执行代码块的力量,无论是简单的重复任务,还是复杂的迭代计算,都能得心应手
掌握分支与循环语句,不仅是学习编程的必经之路,更是提升编程技能、解决实际问题的重要手段。它们教会我们如何构建逻辑清晰、结构合理的程序,如何优化代码性能、提升用户体验。在未来的编程之旅中,愿大家能够灵活运用分支与循环语句,创造出更加精彩、更加智能的程序作品。让我们携手并进,在编程的世界里不断探索、不断前行!
希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!
相关文章:

【C语言初阶】探索编程基础:深入理解分支与循环语句的奥秘
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言入门 🌹🌹期待您的关注 🌹🌹 ❀分支与循环语句 📒1.…...

ERP基础知识
ERP 一、概述 ERP是Event-related Potentials的简称。外加一种特定的刺激,作用于感觉系统或脑 的某一部位,在给予刺激或撤销刺激时,或和当某种心理因素出现时在脑区所产生的电位变化,成为事件相关电位,是一种特殊…...

C++是否可以使用.获取union、struct中的成员变量的地址
C可以使用.获取union、struct中的成员变量的地址 示例代码如下所示 #include <stdio.h> #include <stdint.h>struct u128 { uint64_t v64; uint64_t v0; };int main() {union { unsigned __int128 ui; struct u128 s; } union_temp_m128;void* p1 &union_te…...

【前端】包管理器:npm、Yarn 和 pnpm 的全面比较
前端开发中的包管理器:npm、Yarn 和 pnpm 的全面比较 在现代前端开发中,包管理器是开发者必不可少的工具。它们不仅能帮我们管理项目的依赖,还能极大地提高开发效率。本文将详细介绍三种主流的前端包管理器:npm、Yarn 和 pnpm&am…...

C++ 类和对象 赋值运算符重载
前言: 在上文我们知道数据类型分为自定义类型和内置类型,当我想用内置类型比较大小是非常容易的但是在C中成员变量都是在类(自定义类型)里面的,那我想给类比较大小那该怎么办呢?这时候运算符重载就出现了 一 运算符重载概念&…...
【Python实战因果推断】35_双重差分6
目录 Strict Exogeneity No Time Varying Confounders No Feedback No Carryover and No Lagged Dependent Variable Strict Exogeneity 严格的外生性假设是一个相当技术性的假设,通常用固定效应模型的残差来表示: 严格的异质性说明: 这…...

【HarmonyOS】关于官方推荐的组件级路由Navigation的心得体会
前言 最近因为之前的630版本有点忙,导致断更了几天,现在再补上。换换脑子。 目前内测系统的华为应用市场,各种顶级APP陆续都放出来beta版本了,大体上都完成了主流程的开发。欣欣向荣的气息。 学习思路 关于学习HarmonyOS的问题…...

Spring中事件监听器
实现ApplicationListener接口 Configuration public class A48 {public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(A48.class);context.getBean(MyService.class).doBusiness();context.close()…...

案例|LabVIEW连接S7-1200PLC
附带: 写了好的参考文章: 通讯测试工具和博图仿真机的连接教程【内含图文完整过程软件使用】 解决博图V15 V16 V17 V18等高版本和低版本在同款PLC上不兼容的问题 目录 前言一、准备条件二、步骤1. HslCommunicationDemo问题1:连接失败?问题…...

正点原子STM32(基于HAL库)6
目录 TFTLCD(MCU 屏)实验TFTLCD 简介TFTLCD 简介液晶显示控制器FSMC 简介FSMC 关联寄存器简介 硬件设计程序设计FSMC 和SRAM 的HAL 库驱动程序流程图程序解析 下载验证 LTDC LCD(RGB 屏)实验RGBLCD<DC 简介RGBLCD 简介LTDC 简介…...

flutter Android端权限
flutter 中权限请求path_provider Android 6.0 - 10.0 (API level 23 - 29)Android 11 (API level 30)具体实现示例注意事项 在 Flutter 中使用 path_provider 插件获取除本应用外所有的 PDF 文件,对于不同的 Android 版本(从 Android 6.0 到 Android 14…...

ant design form动态增减表单项Form.List如何进行动态校验规则
项目需求: 在使用ant design form动态增减表单项Form.List时,Form.List中有多组表单项,一组中的最后一个表单项的校验规则是动态的,该组为最后一组时,最后一个表单项是非必填项,其他时候为必填项。假设动态…...

7.16做题总结
今日也是让我看到了繁神的ACM历程,确实,我觉得繁神的历程里面确实有一句很好 不想打算法竞赛了。这是因为有别的事情要做,不是因为我打不动。 不想打比赛凌晨两点才睡了。因为我会困。 不想在群里和高水平选手水群了,因…...

unity使用 MQTT复现plant simulate仿真
unity使用 MQTT复现plant simulate仿真 一、plant simulate端配置 1、plant simulate MQTT组件配置,该组件在类库的信息流类目下,端口不变,填写ip即可; 2、设备配置界面,在控件入口和出口处各挂一个脚本,…...

MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制
🎯要点 🎯概率论和图论数学形式和图结构 | 🎯数学形式、图结构和代码验证贝叶斯分类器算法:🖊多类型:朴素贝叶斯,求和朴素贝叶斯、高斯朴素贝叶斯、树增强贝叶斯、贝叶斯网络增强贝叶斯和半朴素…...

初识HTML
一 HTML HTML(Hyper Text Markup Language),超⽂本标记语⾔.超文本:⽐⽂本要强⼤.通过链接和交互式⽅式来组织和呈现信息的⽂本形式.不仅仅有⽂本,还可能包含图⽚,⾳频,或者⾃已经审阅过它的学者所加的评注、补充或脚注等等.标记语言:由标签构成的语⾔。 1.HTML代码是由“标签…...

基于Rspack实现大仓应用构建提效实践|得物技术
一、实践背景 随着项目的逐步迭代,代码量和依赖的逐渐增长,应用的构建速度逐步进入缓慢期。以目前所在团队的业务应用来看(使用webpack构建),应用整体构建耗时已经普遍偏高,影响日常开发测试的使用效率&am…...

什么是MOW,以bitget钱包为例
元描述:MOW凭借其富有创意的故事情节和广阔的潜力在Solana上脱颖而出。本文深入探讨了其独特的概念和光明的未来。 Mouse in a Cats World (MOW)是一个基于Solana区块链的创新meme项目,它重新构想了一个异想天开且赋予权力的故事。在这个奇幻的宇宙中&am…...

pytorch说明
深度学习中的重要概念: 激活函数: 激活函数的必要性:激活函数不是绝对必须的,但在深度学习中,它们几乎总是被使用。激活函数可以引入非线性,这使得神经网络能够学习更复杂的模式。 激活函数的位置&#x…...

AI语音机器人是否可以设计开放式问题
什么叫开放式提问? 是指提出比较概括、广泛、范围较大的问题,对回答的内容限制不严格,给对方充分自由发挥的余地。 试想一下,就算不是语音机器人,是一个真人销售,和客户沟通时提的问题是开放式的…...

ModuleNotFoundError: No module named
python脚本执行出现这个错误,检查是否安装了对应的模块,确认已经安装,执行还是出错 原因是我时在c程序中启动执行的python脚本,c程序执行是使用了sudo权限,此时会报错,而在shell中执行python(下…...

【操作系统】进程管理——用信号量机制解决问题,以生产者-消费者问题为例(个人笔记)
学习日期:2024.7.10 内容摘要:利用信号量机制解决几个经典问题模型 目录 引言 问题模型 生产者-消费者问题(经典) 多生产者-多消费者问题 吸烟者问题 读者写者问题(难点) 哲学家进餐问题࿰…...

算法刷题笔记 KMP字符串(C++实现,并给出了求next数组的独家简单理解方式)
文章目录 题目描述基本思路实现代码 题目描述 给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出模式串P在字符串S中所有出现的位置的起始下标。 输入格式 第一行输入整数…...

SpringCloud架构师面试
一、微服务是什么 1、基本概念 微服务是一种架构风格(区别于单体架构、垂直架构、分布式架构、SOA架构),应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化:将复杂的系统或者服务进行纵向拆分,每个…...

C语言 | Leetcode C语言题解之第228题汇总区间
题目: 题解: char** summaryRanges(int* nums, int numsSize, int* returnSize) {char** ret malloc(sizeof(char*) * numsSize);*returnSize 0;int i 0;while (i < numsSize) {int low i;i;while (i < numsSize && nums[i] nums[i …...

入职前回顾一下git-01
git安装 Linux上安装git 在linux上建议用二进制的方式来安装git,可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…...

this指向解析
先看题目: 第一题: var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …...

学习小记-Nacos的服务注册与发现原理
服务注册: 当一个服务实例启动时,它会向 Nacos 服务器注册自己的信息,包括 IP 地址、端口号、元数据(如服务版本、区域信息等)。服务实例使用 Nacos API 发送注册请求,Nacos 服务器接收请求并存储服务实例信…...

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台
在当今短视频蓬勃发展的时代,视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台,更能通过AI智能生成文案和自动回复私信评论,为自媒体运营带来前所未有的便利与效率。 一、视频号矩…...

[Spring] SpringBoot基本配置与快速上手
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...