C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使⽤ if 、 switch 实现分⽀结构。
if语句
if 语句的语法形式如下:
表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
例⼦:输⼊⼀个整数,判断是否为奇数。
输出结果:
else
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表⽰呢?
这⾥就需要
if...else...
语句了,语法形式如下:
例⼦:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。
输出结果:
练习:输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
输出结果:
分⽀中包含多条语句
默认在
if
和
else
语句中默认都只控制⼀条语句,⽐如:
上⾯的代码,你会发现输⼊的值不管是>=18 还是⼩于18,"可以谈恋爱了" 都会打印在屏幕上。
这是因为
if
语句只能控制⼀条语句,就是
printf("
成年了
\n");
,if语句为真,则打印成年了,
if语句为假,则不打印,对于
printf("
可以谈恋爱了
\n");
是独⽴存在的,不管if语句的条件的真
假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤
{}
将代码括起来, else 后也可以跟上⼤括号。如下:
输出结果:
嵌套if
在
if else
语句中,
else
可以与另⼀个
if
语句连⽤,构成多重判断。
⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:
输出结果:
悬空else问题
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if
匹配。
我们⾸先从下⾯代码开始
程序运⾏的结果是啥?
很多初学者,上来以判断
a
是 0,不等于 1 ,那就执⾏
else
⼦句,打印
haha
但是当你去运⾏代码,输出的结果是:啥都不输出。
为什么呢?
这就是悬空
else
的问题,如果有多个
if
和
else
,可以记住这样⼀条规则,
else
总是跟最接近
的
if
匹配。
上⾯的代码排版,让
else
和第⼀个
if
语句对⻬,让我们以为
else
是和第⼀个if匹配的,当
if
语句不成⽴的时候,⾃然想到的就是执⾏
else
⼦句,打印
haha
,但实际上
else
是和第⼆个
if
进⾏匹配的,这样后边的
if...else
语句是嵌套在第⼀个
if
语句中的,如果第⼀个
if
语句就不
成⽴,嵌套
if
和
else
就没机会执⾏了,最终啥都不打印。
如果代码改成下⾯这样就更加容易理解了
或者如果我们希望else确实和第⼀个if匹配,可以这样修改代码:
输出结果:
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。
switch语句
除了
if
语句外,C语⾔还提供了
switch
语句来实现分⽀结构。
switch
语句是⼀种特殊形式的
if...else
结构,⽤于判断条件有多个结果的情况。它把多重
的
else if
改成更易⽤、可读性更好的形式。
上⾯代码中,根据表达式
expression
不同的值,执⾏相应的
case
分⽀。如果找不到对应的值,
就执⾏
default
分⽀。
注:
- switch 后的 expression 必须是整型表达式
- case 后的值,必须是整形常量表达式
if语句和switch语句的对⽐
练习:输⼊任意⼀个整数值,计算除3之后的余数
如果使⽤if语句完成,如下:
如果使⽤switch语句改写,就可以是这样的:
上述的代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
switch语句中的break
前⾯的代码中,如果我们去掉case语句中的break,会出现什么情况呢?
测试⼀组,看⼀下结果:
我们发现,7除以3本来余数是1,但是我们发现程序运⾏的结果多了⼀⾏“余数是2”的打印。
这是为什么呢?
原因是
switch
语句也是分⽀效果的,只有在
switch
语句中使⽤
break
才能在跳出
switch
语
句,如果某⼀个
case
语句的后边没有
break
语句,代码会继续玩下执⾏,有可能执⾏其他
case
语句中的代码,直到遇到
break
语句或者
switch
语句结束。就⽐如上⾯的代码就执⾏了
case
2
中的语句。
所以在
switch
语句中
break
语句是⾮常重要的,能实现真正的分⽀效果。 当然, break
也不是每个
case
语句都得有,这就得根据实际情况来看了。
练习:
输⼊⼀个1~7的数字,打印对应的星期⼏
输出结果:
如果需求发⽣变化,变为:
- 输⼊1-5,输出的是“⼯作⽇”;
- 输⼊6-7,输出“休息⽇”
那参考代码如下:
输出结果:
上⾯的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使⽤
break
,或者在哪⾥使⽤
break
,才能正确完成实际的需求。
switch语句中的default
在使⽤
switch
语句的时候,我们经常可能遇到⼀种情况,⽐如
switch
后的表达式中的值⽆法匹
配代码中的
case
语句的时候,这时候要不就不做处理,要不就得在
switch
语句中加⼊
default
⼦句。
switch
后边的
expression
的结果不是
value1
,也不是
value2
的时候,就会执⾏
default
⼦句。
就⽐如前⾯做的打印星期的练习,如果
day
的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可以这样完成代码:
输出结果:
switch语句中的case和default的顺序问题
在
switch
语句中
case
⼦句和
default
⼦句有要求顺序吗?
default
只能放在最后吗?
其实,在
switch
语句中
case
语句和
default
语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把
default
⼦句放在最后处理的。
验证:
输出结果: