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.mzph.cn/bicheng/23708.shtml

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

相关文章

车载以太网测试要测些什么呢?

车载以太网测试大致可以分成两块&#xff1a;TC8测试和以太网通信测试。 TC8测试全称TC8一致性测试&#xff0c;其规范由OPEN联盟制定&#xff0c;包括车载以太网ECU从物理层到应用层的各层互操作性以及常规基础功能服务。目的在于提高不同ECU之间的兼容性。 TC8测试规范可以…

差分原理+练习

差分的原理和前缀和相似&#xff0c;我们先联想一下前缀和。 前缀和计算下标从0到n的和&#xff0c;记为sum[n1];如果想要求出[l,r]区间的和&#xff0c;可以快速的通过sum[r1]-sum[l]来得到 。 前缀和适用于需要多次获取指定连续区间和的情景 而差分即计算相邻两个元素的差…

搜索与图论:树的重心

搜索与图论&#xff1a;树的重心 题目描述参考代码 题目描述 输入样例 9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6输出样例 4参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M N * 2;int n, m…

【VUE 具名插槽的应用】

具名插槽类似于提前将布局安排好&#xff0c;但内容为空&#xff0c;一旦有具体内容填充进来&#xff0c;可以很和谐的展示&#xff0c;不影响整体效果。&#x1f347; “举个&#x1f330;&#xff1a;系统里大部分页面的查询条件是相同的&#xff0c;所以需要封装一个公用的查…

如何在QGIS中加载高清卫星影像?

我们在《如何在GlobalMapper中加载高清卫星影像》一文中&#xff0c;分享了在GlobalMapper中加载卫星影像的方法。 这里再为你分享如何在QGIS中加载高清卫星影像的方法&#xff0c;并可以在文末查看领取软件安装包和图源的方法。 如何加载高清图源&#xff1f; 要在QGIS中在…

接口签名和postman预处理生成签名

nestjs后端代码 controller Get(md5hmacSHA1b64)postMd5hmacSHA1b64(Req() request: Request, Query() query) {// 获取GET请求参数const queryParamsMap new Map(Object.entries(query));return this.handleMd5hmacSHA1b64(queryParamsMap, request);}Post(md5hmacSHA1b64)U…

单点登录(SSO)前端怎么做

单点登录&#xff08;SSO&#xff09;前端怎么做 本文介绍单点登录&#xff08;SSO&#xff09;是什么&#xff0c;还有就是前端怎么做。 单点登录&#xff08;SSO&#xff09;是什么 单点登录&#xff08;SSO&#xff0c;Single Sign On&#xff09;&#xff0c;是在企业内部…

【再探】Java—Java 沙箱机制与类加载器

沙箱&#xff08;Sandbox&#xff09;机制是将Java程序限定在JVM特定的运行范围内&#xff0c;并严格限制代码对本地系统资源的访问&#xff0c;以保证代码的有效隔离&#xff0c;防止对本地系统造成破坏。 1 安全模型 类在加载过程中&#xff0c;类加载器会为类设置初始的安…

gstreamer+mpp调用硬解码播放视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、cpu解码二、gstreamermpp1.默认已安装2.没安装必要软件 总结 前言 以前一直在MPP上开发硬解码推理&#xff0c;最近想弄一个盒子支持调用mpp硬解码播放视频…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

QT Creator与QT的下载安装

0.起因/小结&#xff1a; 因为运行项目需要更高版本的QT。 下载了QT 6.2.0&#xff0c;但是里面的gcc&#xff0c;g&#xff0c;gdb是64bit的&#xff0c;而我的QT Creator是32bit的&#xff0c;所以又下载了QT 13.0.0的64bit版本。 遇到问题&#xff1a;msvcp140_1.dll找不到…

软件管理及部分命令

sed命令 格式&#xff1a; sed [选项] 操作 目标文件 选项&#xff1a; -i&#xff1a;修改原始文件【如果不加-i&#xff0c;那就是仅仅修改内存中的文件副本】 案例&#xff1a;将1.txt中的tom修改成jerry。 sed -i "s/tom/jerry/g" 1.txt 将1…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 对于一维信号&#xff0c;我们可以使用类似移动平均滤波&#xff08;Moving Average Filtering&#xff09;实现denoising。Moving Average Filtering 是一种…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

TPM 是什么?如何查看电脑的 TPM?

TPM 是什么&#xff1f; 首先我们来了解一下 TPM 是什么&#xff0c;TPM 由可信计算组织&#xff08;Trusted Computing Group&#xff0c;TCG&#xff09;开发&#xff0c;为了在提高计算机系统的安全性。随着网络安全威胁的不断增加&#xff0c;TPM 技术逐渐成为确保系统安全…

开源网关Apache APISIX启用JWT身份验证

说明&#xff1a; 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先&#xff0c;确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”&#xff0c;VS Code打开文件夹&#xff0c;打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

vite+ts设置别名

准备工作 安装 types/node 避免代码爆红 npm install types/node一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配…