目录
前言
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语言的入门的朋友来说,这是一套不可多得的教程
此教程分几篇文章发布,初步计划更新到函数,未来时间允许会继续更新
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