06-基于vs2022的c语言笔记——控制流

embedded/2025/3/15 1:49:33/

目录

往期精彩回顾,c语言笔记正在更新中!,敬请期待!

前言

6-1if switch语句

6-1-1if语句

0.if语句的难度与上一章表达式的知识你是否掌握透彻息息相关,因此在学习之前务必好好复习表达式的知识

1.首先介绍什么是语句?

2.什么是控制结构?

3.if语句基本规则介绍

4.if语句的用法举例 

​编辑 5.大括号的省略

6-1-2if else语句

1.首先我们来回顾一下if语句的写法

2.if else语句的语法

 6-1-3else if语句

 1.为什么要有else if语句

2.else if的语法

3.else if的应用 

 6-1-4 嵌套if语句

1.引入

2.格式

 3.应用举例

6-1-5条件运算符

1.引入

2.条件运算符的语法 

 3.条件运算符的应用

 6-1-6 switch语句

1.引入

2.switch语句的语法

3.案例演示 

6-1-7switch语句的一些细节

 1.回顾switch的格式

2.注意事项

6-2循环语句

6-2-1while语句

1.while语句的语法

2.完整代码演示如下

 6-2-1-1利用while语句循环计数

6-2-1-2循环输入

 6-2-2 do while语句

1、do while语句的语法

2、 用do while语句进行从1到n的累加 

3、应用场景

 6-2-3 for语句

1、基本语法

2、利用for进行从1到n的累加 

 6-2-4死循环/无线循环

 1、表示方法:

2、程序运行死循环会怎么样? 

3、死循环的应用

6-3跳转

6-3-1跳转关键字 break

6-3-2跳转关键字 continue

6-3-3跳转关键字goto


往期精彩回顾,c语言笔记正在更新中!,敬请期待!

01-03基于vs2022的c语言笔记——软件安装,写程序前的准备,初识c语言-CSDN博客

04基于vs2022的c语言笔记——数据类型_vs2022 c语言输入字符串-CSDN博客

05-1基于vs2022的c语言笔记——运算符-CSDN博客

05-2基于vs2022的c语言笔记——表达式-CSDN博客

强烈建议学完01-05再往下学习,难度会小很多

前言

本套笔记是基于英雄哪里出来c语言入门到精通课程整理的笔记

包含代码,代码演示结果,以及便于理解的插图

对于想要c语言入门,嵌入式c语言的入门的朋友来说,这是一套不可多得的教程

此教程分几篇文章发布,初步计划更新到函数,未来时间允许会继续更新

6-1if switch语句

6-1-1if语句

0.if语句的难度与上一章表达式的知识你是否掌握透彻息息相关,因此在学习之前务必好好复习表达式的知识

1.首先介绍什么是语句?

语句就是 表达式;

2.什么是控制结构?

c语言

如果语句按顺序依次执行,就是顺序结构,前面我们讲的所有代码都是顺序结构

如果是根据条件的不同来执行语句,使用了if语句或者switch case语句 则是选择结构

如果包含包括`while`循环、`for`循环和`do-while`循环,用于重复执行同一段代码,直到满足特定条件

3.if语句基本规则介绍

if(表达式){执行语句;
}
其中表达式可以是任何表达式,我们之前讲过表达式的结果都会变成一个数值
只要这个数值非0,则执行大括号里的语句
如果数值为0,就会跳过这个大括号里的语句

4.if语句的用法举例 

1>0成立,返回值为1,非0,因此执行第一个if语句

1<0不成立,返回值为0,因此不执行第二个if语句

因此只要if后边的小括号里非0,都会执行大括号里的语句

而只要小括号里为0,则不执行大括号里的语句

为什么 上面不写成表达式也可以执行

因为其实是这样的,1!0包含了常量和运算符,可以算成一个表达式

if(1!0){

语句;

}

if(12!0){

语句;

}

所以推而广之,可以写成下面这样,也就是省略了!0,在语法上是可以接受的

if(a){

语句;

}

 5.大括号的省略

6-1-2if else语句

1.首先我们来回顾一下if语句的写法

你会发现两个if语句的小括号里的表达式是互补的,也就是a要么满足a>=0,要么满足a<0

为了使上述这种小括号内表达式互补的代码简化,就有了if else语句

2.if else语句的语法

 6-1-3else if语句

 1.为什么要有else if语句

所以else if就是为多个相关表达式的连续判断而生的

2.else if的语法

3.else if的应用 

 6-1-4 嵌套if语句

1.引入

你会发现在6-1-3的第三节 else if的应用里,我们并没有设定如果输入的数不在0-100之间时怎么处理,我们默认输入的数是0-100之间的

但是如果要考虑输入的数如果不在0-100之间,要有所显示,已达到让输入的人知道自己输错了的目的

我们就得引入嵌套if语句

2.格式

格式大概是这样,在一个大的if else语句里嵌套一个else if语句

if(a>=0 && a<=100){if(a>=90){printf();
}else if(a>=80){printf();
}else if(a>=70){printf();
}else if(a>=60){printf();
}else{printf();
}
}
else{printf("Error\n");
}

 3.应用举例

假设题目是这样的

一次考试的总分是100分

同学输入自己的成绩从而获得A,B,C,D,E四个等级的评分

输入不在100分范围内的成绩则显示Error

规定

[90-100]  为等级A

[80-89]    为等级B

[70-79]    为等级C

[60-69]    为等级D

60分以下 为等级E

6-1-5条件运算符

1.引入

2.条件运算符的语法 

#include <stdio.h>
int main() {int a = 3, b = 4;int x = -1;/*if (a > b) {x = a;//如果a>b把a的值赋值给x     x = a为表达式1}else {x = b;//如果a<=b,则把b的值赋值给x x = b为表达式2}/*/*条件运算符是三元运算符条件运算符的语法条件表达式(也就是上面的a>b)?表达式1:表达式2含义是判断条件表达式是否成立(返回值是否为1)如果成立 则执行表达式1 如果不成立则执行表达式2*//*既然条件运算符是运算符,那么其目的就是参与构成表达式比如说上面的if语句可以简化为如下表达式x = (a > b ?  a : b);含义是如果a>b成立则把a的值赋值给x如果a>b不成立,即a<=b,则把b的值赋值给x*/x = (a > b ? a : b);printf("%d\n", x);return 0;
}

 3.条件运算符的应用

 6-1-6 switch语句

1.引入

switch语句是用于把所有的选择都列出来,根据不同的条件,任选其一

比如输入day 1-7(对应上面所说的条件),电脑输出显示星期一到星期天中的一个(对应上面所说的所有的选择)

2.switch语句的语法

switch(表达式){case 常量表达式1,:执行语句1;break;case 常量表达式2执行语句2;break;...default:执行语句n;
}

3.案例演示 

#define	_CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {int day;printf("请输入数字1-7中的一个:");scanf("%d", &day);switch (day) {case 1:printf("星期一\n");break;
//如果输入数字1,则执行上面的这个printf语句,然后执行break,整个switch语句就算执行完了
//然后执行整个switch语句后面的代码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;default:printf("输入错误,请输入数字1-7\n");
//如果输入的数没有一个case是满足的,则执行default冒号后面的控制语句}return 0;
}

6-1-7switch语句的一些细节

 1.回顾switch的格式

switch(表达式){case 常量表达式1,:执行语句1;break;case 常量表达式2执行语句2;break;...default:执行语句n;
}

2.注意事项

1.switch后面小括号里的表达式只能是整型和字符型,不能是浮点型

2.case后面跟的东西的计算结果只能是字符常量或者整型常量,不能是变量

 

3.case的值不允许重复,否则会报错,因为一个case值对应的是一种情况 

4.break表示中断,结束switch语句,某些情况下可以不写

什么情况呢?如下

两个case值对应一种情况时,可以省略一个break,这种情况又叫case穿透

 5.default:所有case列举的情况都不匹配时,执行dafault冒号后面的语句

6-2循环语句

6-2-1while语句

1.while语句的语法

首先需要介绍以上四种语句的含义和作用

1、初始化语句:定义变量(一般为i),并进行初始化

如果需要从0开始累加,则使i初始化值为0

如果需要从1开始累加,则使i初始化值为1

根据条件,对i进行初始化

与此同时需要在while语句前提前定义相关变量,或者在i的初始化这一行的下面定义相关变量,做好准备工作

2、条件判断语句:一个表达式,一般用于判断i与n的大小

比如i<=n,则表示只要i<=n成立(表达式计算结果非0),则执行while循环,如果i<=n不成立(表达式计算结果为0),则跳过while循环

3、循环体语句:执行循环操作的核心语句,可以有无数个。

4、条件控制语句:控制循环变量,以防出现循环变量永远满足条件判断语句,从而导致while语句陷入死循环

while语句流程图

 下面进行一个小的实例讲解,比如说你要计算从1加到100的累加和。

我这里前面头文件和#define省略不写,主要体现准备工作还有整个while语句是怎么写的
int n;
printf("请输入一个整数:");//n代表你给电脑限定的累加次数
scanf("%d",&n);
int i=1;//初始化循环变量i
int sum=0;//定义累加和初始值为0
while(i<=n){sum=sum+i
/*比如n=3时,i=1<=3成立,执行sum=sum+i sum=0+1=1此时i=1<=3成立,执行sum=sum+i sum=1+1=2你会发现i永远小于n,条件判断语句永远成立,陷入无限循环因此在循环体语句后面还要加条件控制语句
*/i++//在这里前缀自增和后缀自增效果一样,因为没有其他运算符的参与,也没有进行赋值操作}

2.完整代码演示如下

 6-2-1-1利用while语句循环计数

问题:

输入一个数t

有t组数据

每组数据要求输入两个整数a,b

且对两个整数进行加和输出

代码演示

扩展

上面的输入t,执行t次的格式可以优化成如下这样

//前面的格式和上面一样
while(t--){//循环体语句
}
怎么理解呢,
1、t--最多只能是0,不能为负数,
因为t--等于0时,while语句的条件判断语句已经不成立,不再执行while语句,因此不会再判断条件判断语句了
2、假设输入t=3
先判断条件判断语句,t--是后缀自减,先用后减
影刺t=3>0进入while循环 然后t-1=2(一次while循环)
t=2>0,进入while循环 然后t-1=1(两次while循环)
t=1>0,进入while循环 然后t-1=0(三次while循环)
t=0,t--先用后减,因此t--先返回0,因此条件判断语句的计算结果为0,while语句不进行
可见以上输入t=3,执行了三次while语句

6-2-1-2循环输入

代码演示

所谓循环输入就是如上情况,不会停一直进行while循环

那么怎么才能让这个程序停呢,那当然是条件判断语句不成立的时候啦

所以我们现在需要来看一下scanf("%d%d", &a, &b) != EOF是什么意思

1、首先有!=关系运算符不等于,所以这个式子是一个关系表达式

2、左边scanf("%d%d", &a, &b)就是我们熟悉的输入两个数,那么它在表达式中需要返回值参与表达式运算,那么它的返回值是多少呢?

1. 输入两个数:返回2。
2. 输入部分正确(如一个数字和一个非数字):返回1。
3. 输入完全无法解析(如两个非数字):返回0。
4. 遇到EOF:返回EOF(-1)

然后需要知道EOF是什么意思?

点击EOF并且按下电脑的F12键

你会发现进入了stdio.h这个标准输入输出头文件里,然后看到了

所以EOF是用define定义的常量,值为-1,是一种结束标志

所以当scanf("%d%d", &a, &b) != EOF不成立,也就是scanf("%d%d", &a, &b)返回值等于EOF等于-1时,那么我们怎么操作能让scanf("%d%d", &a, &b)返回值为-1?

按下键盘的Ctrl+c

 6-2-2 do while语句

1、do while语句的语法

2、 用do while语句进行从1到n的累加 

3、应用场景

do while语句用于明确需要至少执行一次循环体语句的时候

 6-2-3 for语句

1、基本语法

2、利用for进行从1到n的累加 

 6-2-4死循环/无线循环

 1、表示方法:

法1:(最常用!)
while(1){    //条件判断语句为常量1,永远成立(返回值非0嘛),还可以用其他的永远成立的式子表示,最简单的就是1//循环体语句
}法2:
do{//循环体语句
}while(1);法3:(了解即可)
for(;;){       //初始化语句,条件判断语句,条件控制语句都不写//循环体语句
}

2、程序运行死循环会怎么样? 

3、死循环的应用

while(1){

    /*

    循环体语句1

    循环体语句2

    ...

    */

}

游戏可以简单理解成就是一个死循环

只有触发一些条件才会退出,也就是下堂课要介绍的跳转结构

那么在这个循环里(大括号里)

循环体语句可以干什么

可以

接收鼠标事件

接收键盘事件

接收逻辑判定

进行画面渲染等等

6-3跳转

6-3-1跳转关键字 break

break是一个关键字,用于跳出循环语句

以下是几种语句中break的用法

6-3-2跳转关键字 continue

continue的作用:跳过本次循环,进行下一次循环

下面我们用一个题目来演示一下continue的作用

题干:

随机输入6个整数

输出其中正整数的和

为什么可以一次性输入多个数?

原因:

虽然在 `for` 循环中调用了 `scanf` 六次,但实际上可以一次性输入六个整数,然后按回车键。`scanf` 会依次读取这些输入值并存储到变量 `x` 中。

具体来说,当输入 `6 -7 9 5 -1 2` 并按回车键时,`scanf` 会按顺序读取这些值:

1. 第一次调用 `scanf` 时,它读取 `6` 并将其存储到 `x` 中。
2. 第二次调用 `scanf` 时,它读取 `-7` 并将其存储到 `x` 中。
3. 依此类推,直到所有六个值都被读取。

`scanf` 会根据输入的格式说明符(`"%d"`)来解析输入流中的整数,并将它们依次存储到指定的变量中。因此,你可以一次性输入多个整数,只要它们之间用空格分隔即可。

6-3-3跳转关键字goto

goto的作用就是跳转到人为定位的标签处

下面以一个题目进行演示

定义两个数,让这两个数的平方和是74

输出这两个数的和分别是多少

显得有点冗杂

可以利用goto直接跳出两个for循环

goto不建议用

原因:

虽然goto可以直接让程序跳转到标记处,从而实现快速的流程控制,

在某些情况下使用goto语句可能会比使用其他的控制结构,比如说嵌套的条件语句和循环更加的高效,

避免了一些不必要的条件判定,和循环的迭代

但是也有缺点,就是可读性差,如果过分的使用goto,会使程序的控制流变得难以理解和跟踪,

程序的逻辑可能会变得非常的混乱,增加了维护的难度

而goto可以用其他语法代替已达到相同的效果

因此不建议使用goto

 


http://www.ppmy.cn/embedded/172122.html

相关文章

oXygen XML Editor—— XML编辑与结构化内容管理的优秀工具

Oxygen XML Editor是用于XML创作和开发的重要工具&#xff0c;为所有用户&#xff08;从初学者到专家&#xff09;量身定制的&#xff0c;它是通用的、跨平台的&#xff0c;并且可以作为独立应用程序和Eclipse插件使用。凭借对XML技术的强大支持&#xff0c;它提供了易于创建、…

Java中常见的PO、VO、DAO、BO、DO、DTO、POJO、Query类解释(通俗易懂)

文章目录 先点击收藏和点赞,切勿白嫖,感谢一丶PO(persistant object)持久对象二丶VO(value object)值对象三丶DAO(Data Access Objects) 数据访问对象接口四丶BO/DO(Business Object) 业务对象层五丶DTO(Data Transfer Object) 数据传输对象六丶POJO(Plain Old Java Objects) 简…

【算法】二叉树的递归遍历

前序遍历 void preOrder(Node *node){if(node ! nullptr){cout << node->data_ << " ";preOrder(node->left_);preOrder(node->right_);}} 中序遍历 void inOrder(Node *node){if (node ! nullptr){inOrder(node->left_);cout << n…

数据安全之策:备份文件的重要性与自动化实践

在信息化高速发展的今天&#xff0c;数据已成为企业运营和个人生活中不可或缺的重要资源。无论是企业的财务报表、客户资料&#xff0c;还是个人的家庭照片、学习笔记&#xff0c;数据的丢失或损坏都可能带来无法挽回的损失。因此&#xff0c;备份文件的重要性日益凸显&#xf…

K8s 1.27.1 实战系列(九)Volume

一、Volume介绍 Volume 指的是存储卷,包含可被Pod中容器访问的数据目录。容器中的文件在磁盘上是临时存放的,当容器崩溃时文件会丢失,同时无法在多个Pod中共享文件,通过使用存储卷可以解决这两个问题。 1、Volume 的核心作用 ​数据持久化与生命周期管理 Volume 的核心目标…

Spring Boot 项目开发流程全解析

目录 引言 一、开发环境准备 二、创建项目 三、项目结构 四、开发业务逻辑 1.创建实体类&#xff1a; 2.创建数据访问层&#xff08;DAO&#xff09;&#xff1a; 3.创建服务层&#xff08;Service&#xff09;&#xff1a; 4.创建控制器层&#xff08;Controller&…

C++中const与指针的使用详解

在 C++ 中,const 和指针的结合可以产生多种语义,主要涉及指针的指向关系和指向数据的可修改性。以下是常见的几种情况及其区别: 1. 指向常量的指针(Pointer to const) 语法:const T* ptr 或 T const* ptr 含义:指针指向的数据是常量,不能通过指针修改数据,但指针本身…

Redis 集合(Set)

Redis 集合(Set) Redis 是一款高性能的键值数据库,以其高性能、易用性以及丰富的数据结构而广受欢迎。在 Redis 中,集合(Set)是一种重要的数据结构,它支持多种操作,如添加、删除、查找元素,以及集合间的运算。本文将详细介绍 Redis 集合的特点、操作和应用场景。 Redi…