05-控制流(分支结构)

news2024/10/6 22:28:42

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 的第一个逻辑行
else
    printf("Jacy\n"); // else 的第一个逻辑行
printf("Even\n"); // 注意此行代码已经不在 else 的管辖范围内

二、 多路分支

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

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

    case <常量2>:
        // 代码块 2
        break;

    case <常量3>:
        // 代码块 3
        break;

    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.coloradmin.cn/o/1796144.html

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

相关文章

微信小程序bindgetphonenumber获取手机号阻止冒泡触发

问题&#xff1a;点击手机号弹出微信的手机号验证组件&#xff0c;这是可以的。但是我点击车牌号&#xff0c;也弹出来了&#xff0c;这就郁闷了。 以下是解决方法 点击手机号时&#xff0c;弹出选择手机号 解决&#xff1a; <view style"display: flex;justify-conte…

Facebook开户|Facebook广告设计与测试优化

早上好家人们~今天Zoey给大家伙带来的是Facebook广告设计与测试优化&#xff0c;需要的家人们看过来啦&#xff01; 一、避免复杂用图和过多的文字 根据Facebook的数据显示&#xff0c;用户平均浏览一个贴文的时间在手机上仅花1.7秒、在电脑上则为2.5秒。因此&#xff0c;广告…

Java1.8 vue版家政服务系统成品源码 家政管家系统源码 家政月嫂系统源码 家政保洁系统源码 在线派单,师傅入驻全套商业源码

Java1.8 vue版家政服务系统成品源码 家政管家系统源码 家政月嫂系统源码 家政保洁系统源码 在线派单&#xff0c;师傅入驻全套商业源码 一、系统定义 家政上门服务系统是一种利用互联网技术&#xff0c;将家政服务需求与专业的家政服务人员进行高效匹配的平台。它允许用户通过…

LeetCode-704. 二分查找【数组 二分查找】

LeetCode-704. 二分查找【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;注意开区间和闭区间背诵版&#xff1a;解题思路三&#xff1a; 题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xf…

Partially Spoofed Audio Detection论文介绍(ICASSP 2024)

An Efficient Temporary Deepfake Location Approach Based Embeddings for Partially Spoofed Audio Detection 论文翻译名&#xff1a;一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入 摘要&#xff1a; 部分伪造音频检测是一项具有挑战性的任务&#xff0…

水电表自动抄表系统

1.简述 水电表自动抄表系统是一种现代化智能化管理系统&#xff0c;它利用先进的物联网&#xff0c;完成了远程控制、即时、零接触的水电表读值收集&#xff0c;大大提升了公共事业服务项目的效率和准确性。该系统不仅减少了人工抄表工作量&#xff0c;还避免了人为失误&#…

【NOIP2020普及组复赛】题3:方格取数

题3&#xff1a;方格取数 【题目描述】 设有 nm 的方格图&#xff0c;每个方格中都有一个整数。现有一只小熊&#xff0c;想从图的左上角走到右下角&#xff0c;每一步只能向上、向下或向右走一格&#xff0c;并且不能重复经过已经走过的方格&#xff0c;也不能走出边界。小熊…

神经网络搭建(1)----nn.Sequential

神经网络模型构建 采用CIFAR10中的数据&#xff0c;并对其进行简单的分类。以下图为例 输入&#xff1a;3通道&#xff0c;3232 ( 经过一个55的卷积) → 变成32通道&#xff0c;3232的图像 (经过22的最大池化) → 变成32通道&#xff0c;1616的图像 ( 经过一个55的卷积) → 变…

电商售后常见的客服快捷语

在电商行业&#xff0c;优质的客户服务体验是留住顾客、建立品牌信誉的关键。面对多样化的售后请求&#xff0c;如何高效、准确地回应顾客&#xff0c;成为每个客服团队必须面对的挑战。今天&#xff0c;我给大家分享一些电商售后常见的客服快捷语&#xff0c;帮助客服人员提高…

AIGC 011-SAM第一个图像分割大模型-分割一切!

AIGC 011-SAM第一个图像分割大模型-分割一切&#xff01; 文章目录 0 论文工作1论文方法2 效果 0 论文工作 这篇论文介绍了 Segment Anything (SA) 项目&#xff0c;这是一个全新的图像分割任务、模型和数据集。SA 项目是一个具有里程碑意义的工作&#xff0c;它为图像分割领域…

网络安全:https劫持

文章目录 参考https原理https窃听手段SSL/TLS降级原理难点缺点 SSL剥离原理发展缺点前端劫持 MITM攻击透明代理劫持 参考 https原理 SNI 浏览器校验SSL证书 https降级 https握手抓包解析 lets encrypt申请证书 https原理 步骤如下&#xff1a; 客户端向服务器发送https请求。…

Java大文件上传、分片上传、多文件上传、断点续传、上传文件minio、分片上传minio等解决方案

一、上传说明 文件上传花样百出&#xff0c;根据不同场景使用不同方案进行实现尤为必要。通常开发过程中&#xff0c;文件较小&#xff0c;直接将文件转化为字节流上传到服务器&#xff0c;但是文件较大时&#xff0c;用普通的方法上传&#xff0c;显然效果不是很好&#xff0c…

docker 拉取不到镜像的问题:拉取超时

error pulling image configuration: download failed after attempts6: dial tcp 31.13.94.10:443: i/o timeout 首先设置国内的镜像源&#xff1a;复制下面直接执行 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF{"registry-mirrors"…

k8s学习--Secret详细解释与应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Secret什么是Secret?Secret四种类型及其特点Secret应用案例&#xff08;1&#xff09;将明文密码进行base64编码&#xff08;2&#xff09;编写创建secret的YAML文…

【人工智能003】图像识别算法模型常见术语简单总结(已更新)

1.熟悉、梳理、总结数据分析实战中的AI图像识别等实战研发知识体系&#xff0c;这块领域很大&#xff0c;需要耗费很多精力&#xff0c;逐步总结、更新到位&#xff0c;&#xff0c;&#xff0c; 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&am…

心理咨询系统|心理咨询系统成品开发功能

心理咨询系统开发后端设计是一个复杂且精细的过程&#xff0c;涉及多个关键领域的专业知识和技术。本文将详细探讨心理咨询系统开发后端设计的各个方面&#xff0c;包括系统架构、数据库设计、接口开发、安全性保障以及性能优化等。 首先&#xff0c;我们来谈谈系统架构。在心理…

贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维

中联建设集团股份有限公司是一家建筑行业的施工单位&#xff0c;专注于建筑施工&#xff0c;业务涉及市政公用工程施工总承包、水利水电工程施工总承包、公路工程施工总承包、城市园林绿化专业承包等&#xff0c;在全国各地开展有多个建筑项目&#xff0c;并且项目时间周期可能…

mac M1下安装PySide2

在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

ESP8266在阿里云上线(arduino)

电脑连接上ESP8266的板子 在arduino编写代码&#xff08;arduino按照之前的配置&#xff0c;已安装好esp的开发板和几个库ArduinoJson我选了5.的版本&#xff0c;PubSubclient,Crypto,AliyunIoTSDK并且修改pubsubclient的参数&#xff09; 在项目&#xff0c;加载库&#xff0c…