第四章 case控制结构
检测一个人是否具备某种职业才能,就是看他能否热爱其中包含的枯燥劳动。----洛根.皮尔索斯.史密斯
在现实生活中,常常会遇到这样的情况:要求在一系列的可选方案中做出选择,而不是在两个方案中做出选择。例如,选择去哪个学校上学,或者选择入住哪个旅馆,或者更加难于决断的事情,选择与哪个女孩结婚(在不同的情况下往往总是做出错误的选择)。严谨的C语言程序也是一样,常常要求在更复杂的情况下做出选择,而不仅仅是在两种情况下做出选择。C语言提供了专门的控制语句来有效地处理这样的分支情况。
4.1 switch
允许在一系列的选项中做出选择的控制语句就是switch,更准确的说应该是switch-case-default控制语句。举个例子:
#include <stdio.h>
int main(void)
{
int i=2;
switch (i){
case 1:
printf("\nI am in case 1");
break;
case 2:
printf("\nI am in case 2");
break;
case 3:
printf("\nI am in case 3");
break;
default:
printf("\nI am in default");
}
system("pause");
}
4.2 提示和陷阱
●可以对case语句进行任意的排列,不一定非要按照升序的形式,如1,2,3这样的顺序来排列case语句及default语句。
●在case和switch中也可以使用字符值。
●从理论上讲,switch可以嵌套在另外一个switch中,这种情况称为switch语句的嵌套。但实际上很少这样做。
●关键字switch的后面紧跟着一个整型表达式,这个表达式可以使任何一个C语言表达式,并且该表达式的值应为整型值。因此,西main的switch语句是合法的: switch(i+j*k)
switch (23+45%4*k)
switch (a<4&&b>7)
●关键字case应为整型常量或字符型常量。在case中使用的表达式也可以是常量表达式,因此,case3+7是正确的,而case a+b是错误的。
4.3 switch的不足之处与巨大的优势
●浮点类型的表达式不能用来作为switch的条件判断。
●case的表达式中不允许出现变量。
●多个case不能使用相同的表达式,因此下面的switch是非法的:
switch (a){
case 3:
...
case 1+2:
...
}
上面说了switch三个明显的缺点,那为什么还要使用switch语句呢?
因为速度!
switch结构执行起来会比多重的if-else结构要快一些。
但是,你要注意的是,如果if-else语句中的条件很简单,而且数量又少,则if-else语句比起机械查表的switch语句执行起来要快。因此,有两个case的switch会比相应的if-else要慢。作为程序员应该根据情况来决定是使用switch还是if-else语句。
4.4 goto语句
“应该避免使用goto关键字!Goto会使C语言程序员的生活变得很痛苦。很少有正当的理由要使用goto语句,使用goto会使程序变得不可靠,可读性差,调试困难。然而也有一些程序员认为goto是很有吸引力的。
对于一些较难的程序设计,使用goto似乎可以让程序的控制很容易的到达想要到达的地方。但是,对同样的问题,通过使用if,for,while和switch可以使陈旭更加规范。这些结构更合乎逻辑,也更容易理解。
goto的最大问题是:当使用goto时不能确定怎样才能到达代码中特定的位置。goto使控制流程变得模糊,因此要尽量避免使用goto。没有它完全可以把事情做好。通过良好的编程技能,goto总是可以避免的。