
4.3.2 switch语句
前面讲述的if语句一般用途是针对两个分支的比较和选择,而switch语句一般用于处理多分支选择。当然,多分支选择可以使用ifelse if…else if…语句来实现,这在前面讲过,但这种连续使用多个elseif实现的多分支选择,可读性不如switch语句好。switch语句的格式如下:

解释一下switch语句:switch后面表达式的值若满足(等于)任何某个case后面的常量表达式值,则执行该case后面的1行或多行语句,直到遇到break语句停止,然后跳出整个switch语句并继续switch后面语句的执行,如果所有case条件都不满足,则会执行default中包含的1行或多行语句,然后跳出整个switch语句。看看如下范例:

有几点说明:
(1)switch后面的表达式,可以是整型表达式,也可以是字符型表达式,甚至可以是枚举型数据(后面会讲到)。当然,还可能是其他类型表达式,但都比较罕见。
(2)每个case后面的常量表达式值彼此之间必须互不相同,不然会出现编译错误。
(3)各个case之间、case和default之间的顺序没有影响,谁在上面,谁在下面都可以。
(4)绝不要忘记break语句,每个case的最后,以及default的最后,都有一个“break;”,否则,程序执行就会出现问题。看看如下范例,在case 1:下面遗漏了“break;”,看一看会产生什么后果:

从上面的代码可以得到一个结论:如果在一个case的最后不加“break;”的话,会导致执行完一个case中包含的语句后,程序执行流程会继续执行下一个case中包含的语句,而不管该case条件(值)是否满足,也就是说,程序执行流程从满足条件的case那作为入口一直执行下去,除非遇到break语句或整个switch语句执行完毕。
所以,绝对不要忘记,每一个switch语句中的case最后都应该跟一个break语句,除非有特殊需求。
(5)可以看到,case中如果包含多行语句,并不需要使用{}将多行语句括在一起,case条件一旦满足,会自动顺序执行本case后面的所有语句。当然,也有人习惯用{}把要执行的语句括起来,这也完全可以。看如下代码:

(6)default可以没有,那么当所有case条件都不满足,整个switch就不被执行,如下范例就是去掉default后的switch语句,因为所有case条件都不满足,所以相当于整个switch语句都不被执行。

(7)多个case条件可以紧挨着写在一起,从而在其中任意一个条件成立时共用一组执行语句。如下代码是从switch语句中拿出的片段,当值为3或者4时都执行同一段代码:
