第 5 讲:switch 语句
if
的弊端
很多时候,if
给我们的使用带来了方便的地方,但是依旧有点丑的是,我们经常会用到同一个变量分情况讨论的时候,但 if
非要写成 if
串联的模式,这样就很丑。于是,我们引入了新的语法格式:switch
语句。
switch
语句的写法
考虑如下 if
串联写法。
switch
从代码里看到,它可能比原本的写法更臃肿了,但代码更清晰了。按照 a
分情况讨论。当 a
值为 2 的时候,执行 c = 1
的赋值操作;其它的同理。default
用来控制其它所有情况,类似于 if
里的 else
条件后没有其它判别情况时的执行操作。
还需要注意的是,每一个 case
语句的最后都有一个冒号,而且在每一个部分结束的时候,都有一个 break
语句作为结束(写法必须是 break;
,即末尾带分号)。这是两个需要注意的地方。
另外,标签之间必须书写 break
是有道理的。如果不写它的话,语句就会贯穿到下一个部分去执行,所以不是非常好。但有些时候,我们也可以考虑使用这种特性来做事情。比如,我们获取 12 个月每一个月多少天的时候,可以这么写:
我们暂且不考虑闰年还是平年,2 月分情况讨论的结果。这样的写法可以看到,像是 1、3、5、7、8、10、12 月,结果都是一样的,所以我们完全不必在中间给它加上 break
。
当然,default
default
调整到前面去。
比如,我们需要在记录成绩等级(A 到 F)的时候,默认把其它情况和不及格显示成一样的结果(F),我们就可以这么做:
注意,switch
的小括号里的东西可以是任意一个整数数值的表达式,比如这个例子里的值就是 score / 10
,算出来等于 6。
注意,之前说过,67 和 10 都是整数,所以计算的除法一定得到的结果是整数,故得到的 6.7 会被截断为 6,而且截断不是四舍五入。
贯穿标签的用法
在前文里,所有 case
语句 default
都被称为标签。当有些时候,我们迫不得已需要贯穿标签,所以出现了前文的合并同类项的类似格式。但有些时候,我们除了这种贯穿模式之外,还有一种情况可以这么用,即不写 break
语句。
给定 month
数值表示当前月份,求从 1 月份到这个月一共多少天(暂不考虑日期是多少)。那么代码可以这么写:
你可以思考一下,为什么这种模式可以不写 break
语句。
缺乏不等模式判断
switch
有一个缺点在于,它没有不等模式的判别,比如我们希望某个数字在 0 到 60 的时候是差, 61 到 80 的时候是中等,81 到 90 的时候是良好,91 到 100 是优秀。这个时候,我们只能使用 if
语句的串联,switch
很抱歉的是,在这一点并没有提供对应的语法判别。
if
判别里写的是 score <= 某数值
呢?比如 61 到 80,不应该写成 score >= 61 && score <= 80