05-控制流(分支结构)

05-控制流(分支结构)

一、二路分支

程序中某一段代码需要满足一定的条件才会被执行。

  • if 语句:用于表达一种条件,如果条件满足则执行某个代码块。
  • if-else 语句:用于表达一种条件,如果条件满足则执行某个代码块,否则执行另外一个代码块。
// if 语句
int a = 100;if (a > 100) { // 判断条件/* 如果满足则执行该代码块 */printf("耗子尾汁!!\n");
}// if-else 语句
if (a < 99) {printf("大意了!!\n");
} else {printf("没有闪!!!\n");
}// if-else if-else 语句
if (a < 99) {printf("大意了!!\n");
} else if (a > 99) {printf("没有闪!!!\n");
} else {printf("不讲武德!!!\n");
}

注意

  • if 语句可以单独使用,但 else 不可以单独使用,必须在 if 后面配套使用。
  • 建议为 ifelse 配对的大括号 { }。否则,需要注意只能识别 if / else 后面的第一个逻辑行的语句。
if (a > 1)printf("Hello\n"); // if 的第一个逻辑行
elseprintf("Jacy\n"); // else 的第一个逻辑行
printf("Even\n"); // 注意此行代码已经不在 else 的管辖范围内

二、 多路分支

根据不同的条件来执行不同的代码块。

switch (表达式<判断的条件>) {case <常量1>:// 代码块 1break;case <常量2>:// 代码块 2break;case <常量3>:// 代码块 3break;default:// 代码块 N
}

2.1 示例

int num = 0;printf("请你来几拳!!!\n");
scanf("%d", &num);
while(getchar() != '\n'); // 清空标准输入缓冲区switch (num) {case 1:printf("它一个左勾拳!!\n");break;case 2:printf("它一个左勾拳和一个右鞭腿!!\n");break;case 3:printf("一个不小心打我脸上了!!!!!\n");break;default:printf("它怂了!! !!!\n"); 
}

注意

  • switch(num) 语句中的 num 必须是一个整型的表达式。
  • case 语句中的常量必须是整型常量,包括普通的字符,不包括const 修改的整型数据。
  • break 用来中断/跳出当前的循环。如果没有则会从条件满足的语句开始一条一条的往下执行,直到整个 switch-case 结束或者遇到其它代码块中的 break
  • default 并不是必须存在,它一般放在最后面,用来提示用户表示都不满足以上条件。由于在最后面可以不添加 break

练习:

  1. 使用if-esle 语句来实现检测用户输入的是大写字符或者是小写字符。(小写字母a到z的ASCII码值从97开,大写是从65开始)
  2. 使用switch - case 语句来实现用户输入1-7 程序输出星期几

三、const

用来修饰一个变量使之不可被修改。

3.1 作用

  • 修饰变量:使得变量不能被修改。
  • 修饰指针:使得指针的指向不能改变或者指针所指向的内容不得改变。
int const a = 100; // 定义了一个不可被修改的变量 a
const int b = 200;a = 300; // 错误 assignment of read-only variable ‘a’
b = 250; // 错误 assignment of read-only variable ‘b’

四、whiledo...while 循环

使得程序中某一段代码块重复循环执行。

4.1 while 语法

while (表达式) {// 代码块
}
4.1.2 示例
int num = 10;while (num) { // 非零则真 (布尔值)printf("num: %d\n", num--);
}
4.1.3 while 的逻辑
  • 先判断条件是否成立,条件为真则执行代码块。
    在这里插入图片描述

4.2 do...while

do {// 代码块
} while (表达式);
4.2.1 示例
int num = 10;do {printf("num: %d\n", num--);
} while (num);
4.2.2 do...while 的逻辑
  • 先执行一次代码块,然后再判断条件是否成立(最少会执行一次代码块)。
    在这里插入图片描述

注意

  • while(num); 是空循环,这个分号要慎重。
  • while 循环先进行判断且条件为真,然后再执行代码块(有可能一次都不执行)。
  • do...while 则是先执行一次代码块,然后再判断条件是否成立(最少会执行一次代码块)。

五、for 循环

while 类似,都是让程序中某一段代码块重复运行,但 for 相对 while 来说更加紧凑,把所有的循环控制都集中到一行代码中。

for (初始化语句; 判断语句; 表达式) {// 代码块
}

5.1示例

for (size_t i = 0; i < num; ++i) {printf("i: %ld\n", i);
}for (;;) { // 相当于 while(1) 死循环printf("死循环\n");
}

注意

  • 初始化语句只会被执行一次。
  • 第三个表达式(如 ++i)在第一次循环的时候并没有被执行。
  • 第三个表达式中,前缀/后缀(如 ++ii++)并不影响 i 在循环中取值的先后。
  • for 循环语句中,三个表达式都可以省略,但是分号必须留下
  • for 循环中直接定义并初始化变量只在 C99 及以上的编译规则下可以这样做。

六、breakcontinue

  • break:跳出循环结构,跳出当前层的循环。

  • continue:结束当前这一次循环,重新进入下一次的循环。

6.1 示例

for (int i = 0; i < num; ++i) {while (1) { // 在循环体内部可以嵌套其它的循环printf("你打我呀!!\n");break; // 跳出 while 这一层循环,并不影响外面的 for}if (i == 5) {continue; // 跳过当前这一次循环,导致后面的代码在当次循环中不执行}printf("i: %d\n", i);
}
  • whiledo...while 用于重复执行代码块。
  • for 循环将所有的循环控制都集中到一行代码中,使代码更加紧凑。
  • break 用于跳出当前层的循环。
  • continue 用于结束当前这一次循环,直接进入下一次循环。

七、goto语句

goto 语句是一种无条件跳转,可以在程序中跳转到指定的标签位置继续执行。

7.1 语法

int main(int argc, char const *argv[]) {// 代码块goto 标签;标签:// 代码块return 0;
}

7.2 实例

以下是一个使用 goto 语句的示例程序:

#include <stdio.h>int main(int argc, char const *argv[]) {int num = 0;printf("请你来几拳!!!\n");scanf("%d", &num);while (getchar() != '\n'); // 清空标准输入缓冲区for (int i = 0; i < num; ++i) {goto Even; // 无条件跳转到标签为 Even 的位置}Even:printf("这里是标签的位置!!!\n");return 0;
}

注意事项:

  • 标签后面有一个冒号 :
  • goto 语句是一个无条件跳转语句,不利于程序的可读性,一般不建议使用。
  • goto 语句通常用于处理严重的错误,并退出程序,特别是在驱动程序和嵌入式系统开发中比较常见。

示例解析:

#include <stdio.h>int main(int argc, char const *argv[]) {int num = 0;printf("请你来几拳!!!\n");scanf("%d", &num);while (getchar() != '\n'); // 清空标准输入缓冲区for (int i = 0; i < num; ++i) {goto Even; // 无条件跳转到标签为 Even 的位置}Even:printf("这里是标签的位置!!!\n");return 0;
}
  • 程序开始时,提示用户输入一个整数 num
  • 清空标准输入缓冲区后,进入 for 循环。
  • for 循环中,立即执行 goto Even;,跳转到 Even 标签处。
  • 输出 "这里是标签的位置!!!"
  • 程序结束。

7.3 使用建议

尽量避免使用 goto 语句,因为它会使程序的控制流变得复杂,难以维护和理解。可以通过函数、循环和条件语句来实现大多数 goto 的功能。

在特殊情况下(如处理错误或异常情况)使用 goto 时,应该小心并尽量简化跳转逻辑。
加粗样式

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

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

相关文章

带你了解消防安全与应急救援,2024北京消防展6月盛大开启

带你了解消防安全与应急救援&#xff0c;2024北京国际消防展6.26盛大开启 在日益关注安全问题的今天&#xff0c;消防安全与应急救援已经成为社会发展的重要一环。为了提高全民消防安全意识&#xff0c;推动应急救援技术的发展&#xff0c;2024年北京国际消防展将于6月26日盛大…

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现QRCNN-GRU-…

0基础学习区块链技术——推演猜想

大纲 去中心预防篡改付出代价方便存储 在《0基础学习区块链技术——入门》一文中&#xff0c;我们结合可视化工具&#xff0c;直观地感受了下区块的结构&#xff0c;以及链式的前后关系。 本文我们将抛弃之前的知识&#xff0c;从0开始思考和推演&#xff0c;区块链技术可能是如…

暑期来临,AI智能视频分析方案筑牢防溺水安全屏障

随着夏季暑期的来临&#xff0c;未成年人溺水事故频发。传统的防溺水方式往往依赖于人工巡逻和警示标识的设置&#xff0c;但这种方式存在人力不足、反应速度慢等局限性。近年来&#xff0c;随着视频监控智能分析技术的不断发展&#xff0c;其在夏季防溺水中的应用也日益凸显出…

Vue3——实现word,pdf上传之后,预览功能(实测有效)

vue-office/pdf - npm支持多种文件(**docx、excel、pdf**)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。. Latest version: 2.0.2, last published: a month ago. Start using vue-office/pdf in your project by running npm i vue-office/pdf. There are …

kafka安装流程

安装kafka前需要安装zookeeper zookeeper安装教程 1.新建一个logs文件夹 2.修改配置文件 3.修改listeners参数 4.以管理员身份启动kafka服务 .\bin\windows\kafka-server-start.bat .\config\server.properties 如果报 输入行太长。 命令语法不正确。 解决方案如下&#x…

力扣 503. 下一个更大元素 II

题目来源&#xff1a;https://leetcode.cn/problems/next-greater-element-ii/description/ C题解&#xff1a;因为是循环数组&#xff0c;所以对数组进行了两次遍历&#xff0c;相当于循环。使用了栈&#xff0c;一个存放元素&#xff0c;一个存放索引&#xff0c;用来更新res…

智能仪表通过Modbus转Profinet网关与PLC通讯方案

一、功能及优势&#xff1a;Modbus转Profinet网关&#xff08;XD-MDPN100/300&#xff09;的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议&#xff0c;支持Modbus RTU主站/从站&#xff0c;并可以与RS485接口…

STL:list

文章目录 标准库中的listlist的构造list的迭代器list的容量list的访问list的修改 list的迭代器失效list的反向迭代器list 与 vector的对比 标准库中的list list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双…

性能监控工具

性能是任何一款软件都需要关注的重要指标。除了软件的基本功 能&#xff0c;性能可以说是评价软件优劣的最重要的指标之一。我们该如何有 效地监控和诊断性能问题呢?本章基于实践&#xff0c;着重介绍一些针对系统 和Java虚拟机的监控和诊断工具&#xff0c;以帮助读者在实际开…

Promise总结

参考大佬 傻小胖的文章ES6 Promise用法小结-CSDN博客 一. 初识Promise Promise对象保存了异步调用的结果&#xff0c;如果正在调用&#xff0c;该对象的状态为 pending ;如果执行成功, 该对象的状态为 fulfilled&#xff1b;如果执行失败, 该对象的状态为 rejected 成功&…

企业在现代市场中的战略:通过数据可视化提升财务决策

新时代&#xff0c;财务规划团队不仅仅是企业内部的一个部门&#xff0c;更是帮助企业做出明智决策和设定战略目标的中坚力量。在当今瞬息万变的商业环境中&#xff0c;财务专业人士需要具备应对挑战并引导企业走向成功的角色职能。企业领导者时常面临着数据压力&#xff0c;需…

Ubuntu系统的k8s常见的错误和解决的问题

K8s配置的时候出现的常见问题 Q1: master节点kubectl get nodes 出现的错误 或者 解决方法&#xff1a; cat <<EOF >> /root/.bashrc export KUBECONFIG/etc/kubernetes/admin.conf EOFsource /root/.bashrc重新执行 kubectl get nodes 记得需要查看一下自己的…

树形表/树形数据接口的开发

数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…

AWS EC2服务器开启root密码,SSH登录

1) EC2 Instance Connect连接&#xff0c;更改root密码 sudo passwd root 2&#xff09;接着切换到切换到 root 身份&#xff0c;编辑 SSH 配置文件 $ sudo -i$ vi /etc/ssh/sshd_configPasswordAuthentication no&#xff0c;把 no 改成 yes #PermitRootLogin prohibit-passw…

Java实现经纬度坐标转换

一、坐标系统简介 坐标系统&#xff0c;是描述物质存在的空间位置&#xff08;坐标&#xff09;的参照系&#xff0c;通过定义特定基准及其参数形式来实现。 坐标是描述位置的一组数值&#xff0c;按坐标的维度一般分为一维坐标&#xff08;公路里程碑&#xff09;和二维坐标…

微软Edge浏览器深度解析:功能、同步、隐私与安全

微软Edge浏览器是微软公司开发的一款网页浏览器,它基于Chromium内核,提供了快速、安全和兼容性良好的网页浏览体验。以下是关于微软Edge浏览器的详细信息和使用指南: 微软Edge浏览器的主要特点: 1. 基于Chromium内核: 渲染引擎:Chromium内核是基于开源项目Blink的,它…

任务3.7 开发名片管理系统

本实战项目以Java语言为基础&#xff0c;精心打造了一个功能全面的名片管理系统。系统采用面向对象的设计原则&#xff0c;通过Card类来封装每张名片的详细信息&#xff0c;如姓名、单位、职位和联系电话等&#xff0c;并提供了标准的访问器和修改器方法以确保数据的安全访问。…

解决 iOS 端小程序「saveVideoToPhotosAlbum:fail invalid video」问题

场景复现&#xff1a; const url https://mobvoi-digitalhuman-video-public.weta365.com/1788148372310446080.mp4uni.downloadFile({url,success: (res) > {uni.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: (res) > {console.log("res > &…

freertos初体验 - 在stm32上移植

1. 说明 freertos内核 非常精简&#xff0c;代码量也很少&#xff0c;官方也针对主流的编译器和内核准备好了移植文件&#xff0c;所以 freertos 的移植是非常简单的&#xff0c;很多工具&#xff08;例如CubeMX&#xff09;点点鼠标就可以生成一个 freertos 的工程&#xff0…