4.5 switch语句
当分支较多时,利用if语句设计出来的程序会变得复杂冗长,并且很容易产生if与else不匹配的问题。C语言提供了switch语句专门处理多路分支的情形,以使程序变得更简洁。但switch语句比较复杂,使用时要多加注意。
switch语句的一般形式为:
switch(表达式) { case常量表达式1:语句1; case常量表达式2:语句2; …… case常量表达式n:语句n; default:语句n+1; }
其中,switch、case、default是C语言的保留字。
switch语句的执行过程为:先计算“表达式”的值,并逐个与其后的“常量表达式i”(即常量表达式1、常量表达式2、……、常量表达式n)的值相比较,当“表达式”的值与“常量表达式i”的值相等时,即开始执行该“常量表达式i”后的“语句i”,如果没有遇到break语句,则继续执行后面所有的case后(跳过case部分)的语句,直到遇到break语句或者switch语句最后的“}”。如果“表达式”的值与所有的“常量表达式”均不相同,则执行default后的语句。
在switch语句中,常使用break语句来结束switch语句。break语句的格式为:
break;
是C语言最简单的语句之一。
【例4.9】 某幼儿园只收2~6岁的儿童。2~3岁入小班,4岁入中班,5~6岁入大班。根据输入的年龄,求应入的班级。
分析:设年龄为age,当age为2和3时,应输出同样的内容“入小班”,age为5和6时输出同样的内容“入大班”。该题算法比较简单,直接给出程序。
程序如下:
1 #include<stdio.h> 2 void main() 3 { int age; 4 printf("Please enter age:"); 5 scanf("%d",&age); 6 switch(age) 7 { case 2: 8 case 3: printf("入小班\n"); break; 9 case 4: printf("入中班\n"); break; 10 case 5: 11 case 6: printf("入大班\n"); break; 12 default: printf("不能入园\n"); 13 } 14 }
【例4.10】 用switch语句重写例4.5,将百分制成绩划分为5段输出。
分析:除不及格档次外,其他各等级中每个数的十位数字均相同(100除外)。可以用成绩的十位数字作为条件来写程序。设成绩为score,除以10取整后的结果为k,则本题的程序如下:
1 #include<stdio.h> 2 void main() 3 { int score,k; 4 printf("input a score:"); 5 scanf("%d",&score); 6 k=score/10; 7 switch(k) 8 { 9 case 10: 10 case 9: printf("优秀\n"); break; 11 case 8: printf("良好\n"); break; 12 case 7: printf("中等\n"); break; 13 case 6: printf("及格\n"); break; 14 default: printf("不及格\n"); 15 } 16 }
在使用switch语句时,应注意以下几点:
① switch后面的“表达式”,可以是int、char和枚举型中的一种;
② 在case后的各常量表达式的值不能相同,否则会出现错误;
③ case后面的常量表达式仅起语句标号的作用,表示程序的入口,但不表示结束,也就是说,执行完某个case后的语句后,如果后面有其他case的语句,则继续执行这些语句,为此,需要使用break语句,以便跳出switch语句;
④ 在每个case后,允许有多个语句,不必用“{}”括起来;
⑤ 各case和default子句的先后顺序可以任意交换,而不会影响程序的执行结果,但要注意合理地添加break语句;
⑥ default部分可以省略;
⑦ 用switch语句实现的多分支程序,完全可以用if语句来实现。