目录
- 1 if语句
- 1.1 if
- 1.2 else
- 1.3 else if
- 1.4 注意事项
- 1.4.1 注意事项1
- 1.4.2 注意事项2
- 2 switch语句
- 2.1 switch
- 2.2 注意事项
- 2.2.1 空格问题
- 2.2.2 break
- 2.2.3 default 语句的位置
- 3 条件判断常用运算符
- 3.1 关系运算符
- 3.2 逻辑运算符
- 3.2.1 &&运算符(逻辑与)
- 3.2.2 ||运算符(逻辑或)
- 3.2.3 !运算符(取反)
- 4 while 循环
- 5 for 循环
- 6 do...while循环
- 7 循环中常用关键字
- 7.1 break
- 7.2 continue
- 7.2.1 while中的continue
- 7.2.2 for中的continue
- 7.2.3 do...while中的continue
在C语言中,分支语句主要有if语句,switch语句两种,而循环语句主要有while循环,for循环,do…while循环两种。接下来,就来介绍一下这些语句
1 if语句
1.1 if
if 语句在C语言中的写法如下:
if(表达式)内部语句;....//其它代码if的执行流程为:若表达式(条件)为真,则会执行内部语句,若表达式(条件)为假,则不会执行内部语句,而是继续执行后方代码。在C语言中,非0的数值表示真,0则表示假
实践:判断一个数是否为正数
有了 if 语句,就可以进行条件判断,所以方法就是让用户输入一个数值,让 if 语句判断数值是否 >0,>0 则输出是正数
#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num>0)//大于0,是正数{printf("是正数");}return0;}1.2 else
else 的用法如下:
if(表达式)内部语句;else内部语句;...//其它语句当 if 的表达式结果为假,if 的内部语句就不会执行,会转而去执行 else 的内部语句,而 if 的表达式结果为真,则 if 的内部语句会执行,else 的内部语句不会执行。
实践:判断一个数是奇数还是偶数
让用户输入一个数值,使用if…else 语句,让 if 语句判断数值 % 2 是否等于0, = 0 则表明2是因子,输出是偶数,否则通过else来输出是奇数
#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num%2==0)//2是因子,是偶数{printf("是偶数");}else//否则就是奇数{printf("是奇数");}return0;}1.3 else if
else if 的写法如下:
if(表达式1)内部语句;elseif(表达式2)内部语句;...//其它语句如果表达式1为真,则会执行if 的内部语句,若表达式1为假,不会执行if 的内部语句,由表达式2进行判定,若表达式2为真,则会执行else…if 的的内部语句,如果表达式2也为假,则不会执行else…if 的内部语句,会转而去执行后续的其它语句
实践:根据输入的年龄,判断状态。<18打印未成年,>=18并且<=44打印青年,45岁及以上打印中老年
通过 if…else if 的方式来进行不同的条件判断,满足条件时输出对应信息即可
#include<stdio.h>intmain(){intage=0;scanf("%d",&age);if(age<18)//<18岁{printf("未成年");}elseif(age>=18&&age<=44){printf("青年");}else//45岁及以上{printf("中老年");}return0;}1.4 注意事项
1.4.1 注意事项1
if 后不加大括号时,默认只能跟一条语句,比如:
intmain(){if(0)//0表示假printf("hello");//由于0是假,所以此语句不会执行printf("world");//if 后默认跟一条,所以这条会打印return0;}在上方例子中,if 的内部语句只有 printf(“hello”) 这一条,不管 if 后的表达式是真实假,printf(“world”);都会执行。如果不想执行,可以加入大括号,比如:
intmain(){if(0)//0表示假{printf("hello");printf("world");}return0;}在这里,由于if后加了大括号,所以大括号内的所有语句,都是 if 的内部语句,if 后的表达式为假就都不会执行
1.4.2 注意事项2
观看这一段代码,它的结果是?
intmain(){inta=0;intb=1;if(a)if(b)printf("world");elseprintf("error");return0;}可能会有人觉得是打印error,实际上,什么都不会输出
为什么会这样呢?
因为else 总与最近的 if 进行对齐,所以上面这串代码就可以这样解释:
a为0,b为1,else 与最近的 if 对齐,也就是 if(b),所以相当于 if(b)…else是 if(a) 的内部语句, if (a) 进行判断,结果是假,不会执行内部语句,所以什么都没有输出
更改一下格式后,相当于是这样的代码:
intmain(){inta=0;intb=1;if(a){if(b)printf("world");elseprintf("error");}return0;}2 switch语句
2.1 switch
switch语句的写法如下:
switch(整形表达式){case(整形常量表达式1):语句[break]case(整形常量表达式2):语句[break]default:语句}整形表达式:指计算结果为整形的表达式,比如1 + 2, 3 % 2这样的表达式,字符也是可以的,因为字符是以 ASCII 的形式存储的,ASCII 也是整形,但是浮点数不能使用。
整形常量表达式:不可以被修改的值是常量,所以这个表达式指像1,2,3这样的值,字符也可用,浮点数不可用。
switch 语句会根据整形表达式的值,来对 case 中的整形常量表达式进行匹配,如果能找到匹配项,则执行 case 内的语句,找不到并且写了 default 的情况下,会执行 default 语句中的内容
实践:输⼊任意⼀个整数值,计算除3之后的余数
除3后的余数有0,1,2,所以只需要在整形表达式内写上取余的表达式,让 switch 语句根据结果进行 case 的匹配即可
intmain(){intn=0;scanf("%d",&n);switch(n%3)//计算出0,1,2{case0://计算出0,匹配至0printf("余数0");break;case1://计算出1,匹配至1printf("余数1");break;case2://计算出2,匹配至2printf("余数2");break;}return0;}2.2 注意事项
2.2.1 空格问题
case后必须要有一个空格,否则会有语法错误
2.2.2 break
case 语句中的 break 是用来跳出 switch 语句的,如果没有 break 语句,那么执行时,会一直下滑,直到遇到 break 或者 switch 语句结束,比如:
intmain(){intn=0;scanf("%d",&n);switch(n%3)//计算出0,1,2{case0://计算出0printf("余数0");case1://计算出1printf("余数1");case2://计算出2printf("余数2");break;}return0;}如果 n % 3 计算出0,会匹配至 case 0,但是由于 case 0 和 case 1没有 break 语句,执行时,会将 case 0,case 1 和 case 2 内的语句按顺序执行
2.2.3 default 语句的位置
default 语句的位置在 switch 中没有特别要求,放在 switch 语句内任何地方都是不影响语法的,但是要保证不能影响代码逻辑
3 条件判断常用运算符
3.1 关系运算符
| 运算符 | 作用 |
|---|---|
| > | 判断左侧是否大于右侧 |
| < | 判断左侧是否小于右侧 |
| >= | 判断左侧是否大于等于右侧 |
| <= | 判断左侧是否小于等于右侧 |
| == | 判断左侧是否等于右侧 |
| != | 判断左侧是否不等于右侧 |
以上的运算符会根据结果会返回0或1,用来表示假和真
3.2 逻辑运算符
3.2.1 &&运算符(逻辑与)
&&运算符的作用是,根据左右两侧的真假情况来得出真假
情况包括:
| 两侧情况 | 结果 |
|---|---|
| 1 && 1 | 两侧都为真,结果是真 |
| 1 && 0 | 右侧为假,结果是假 |
| 0 && 1 | 左侧为假,结果是假 |
| 0 && 0 | 两侧都为假,结果是假 |
总结一下就是两真则真,一假则假
短路现象:若&&运算符左侧的计算结果是假,则不会去计算右侧的结果,直接得到假,也就是0
3.2.2 ||运算符(逻辑或)
||运算符的作用是,根据左右两侧的真假情况来得出真假
情况包括:
| 两侧情况 | 结果 |
|---|---|
| 1 || 1 | 两侧都为真,结果是真 |
| 1 || 0 | 一侧为真,结果是真 |
| 0 || 1 | 一侧为真,结果是真 |
| 0 || 0 | 两侧都为假,结果是假 |
总结一下就是一真则真,两假则假
短路现象:若||运算符左侧的计算结果是真,则不会去计算右侧的结果,直接得到真,也就是非0(默认1)
3.2.3 !运算符(取反)
!运算符的作用是,将真转换为假,假转换为真
| 案例 | 结果 |
|---|---|
| !1 | 0 |
| !0 | 1 |
4 while 循环
while 的语法如下:
while(表达式)内部语句while 会根据表达式的结果来执行内部语句,结果是假,就不执行,结果是真,则执行,执行完毕后会再次进行条件判断,结果是假,就循环停止,结果是真,则再执行一次,进行往复来回
实践:打印1-10之间的数字
设置变量 i 作为循环变量,每一次循环让 i 自增1并打印数值,直到 i 大于10,循环停止
intmain(){inti=1;//定义循环变量while(i<=10)//判断{printf("%d ",i);++i;//调整循环变量}return0;}5 for 循环
while 循环中,循环变量的定义,判断,调整(自增)容易因为代码量的增大导致间隔巨大,不方便查看,所以,设计了 for 循环
for 的语法如下:
for(循环变量初始化;条件判断;变量调整){内部语句;}运行 for 循环时,先对循环变量进行初始化,再进行条件判断,若为假,则结束循环,若为真,则执行内部语句,执行完内部语句后,进行变量调整,再进行条件判断,若为假,则结束循环,若为真,则执行内部语句,如此往复
实践:打印1-10之间的数字
intmain(){inti=0;for(i=1;i<=10;++i){printf("%d ",i);}return0;}6 do…while循环
do…while 循环的语法如下:
do{内部语句;}while(表达式);do…while与其他的循环不同的点是,do…while不管条件如何,总会先执行一次内部语句,再进行条件判断,若为假,则结束循环,若为真,则继续执行内部语句,如此往复
实践:打印1-10之间的数字
intmain(){inti=1;do{printf("%d ",i);++i;}while(i<=10);return0;}7 循环中常用关键字
7.1 break
在 while, for, do…while 中,break 的作用都是一样的,主要作用为结束本层循环并执行后续的代码
例子:
intmain(){inti=1;while(i<=10){if(i==5)break;printf("%d ",i);++i;}return0;}在这个例子中,当循环变量 i 自增到5时,会出发 if 语句中的break,直接跳出循环,因此只会打印1 2 3 4
7.2 continue
continue在 while,for,do…while 中的主要效果相近,但细节上有微妙的差别
作用主要是跳过当次循环的后续语句
7.2.1 while中的continue
while 循环由于变量调整语句的位置较为随意,所以可能会导致死循环,比如:
intmain(){inti=1;while(i<=10){if(i==5)continue;printf("%d ",i);++i;}return0;}当 i 循环至 5 时,if 语句的条件判定为真,触发 continue,直接跳过了后续的打印和 ++i 语句,进行条件判断并进入下次循环,但下次循环时,i 仍然是5,依然不会执行 ++i ,如此往复,就变成了死循环
7.2.2 for中的continue
for 循环由于执行完了内部语句才会调整变量,所以一般不会死循环,除非你真的把调整语句写在了 continue 的后面
例子:
intmain(){inti=1;for(i=1;i<=10;++i){if(i==5)continue;printf("%d ",i);}return0;}当 i 等于5时,执行 if 内的 continue 语句,直接跳过后续的打印语句,执行++i, 此时的 i 会变成6,再次进行判断,因此不会死循环
7.2.3 do…while中的continue
do…while 中的 continue 与 while 中的类似。也会触发死循环,比如:
intmain(){inti=1;do{if(i==5)continue;printf("%d ",i);++i;}while(i<=10)return0;}原因与while中相同