05-控制流(分支结构)

2024-06-07 01:12
文章标签 05 结构 分支 控制流

本文主要是介绍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 时,应该小心并尽量简化跳转逻辑。
加粗样式

这篇关于05-控制流(分支结构)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037767

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循