选择程序结构:switch-case
当程序中的分支过多时,如果此时还是用if-else结构,会显得比较冗余,此时可以考虑使用switch-case语句。switch-case语句的使用方法如下:
switch(表达式)
{
case 常量1:语句1;break;
case 常量1:语句1;break;
...
case 常量n:语句n;break;
default:默认操作语句;
}
代码块外的语句;
switch会根据表达式的值,跟case后面的值进行匹配,匹配成功后,接着就会执行case后面的语句,执行结束后,接着一个break语句,结束当前代码块程序的运行,跳到代码块外的语句继续执行下去。如果表达式的值跟所有case后面的值都没有匹配,就会执行default分支后面的默认代码块。
接下里就以一个例子,给大家演示下switch-case的用法:输入一个考试成绩[0,100],根据输入的分数来判断成绩等级:卷神、优秀、良好、中等、及格、不及格。如果我们使用if-else语句实现,大概的实现思路是这样的:
#include <stdio.h>
int main(void)
{
int score;
printf("input a score: ");
scanf("%d", &score);
if(score == 100)
printf("卷神\n");
else if(score >= 90)
printf("优秀\n");
else if(score >= 80)
printf("良好\n");
else if(score >= 70)
printf("中等\n");
else if(score >= 60)
printf("及格\n");
else
printf("不及格\n");
return 0;
}
如果我们使用switch-case语句,大概的实现思路是这样的:
int main(void)
{
int score;
printf("input a score: ");
scanf("%d", &score);
switch(score/10)
{
case 10:printf("卷神\n");break;
case 9:printf("优秀\n");break;
case 8:printf("良好\n");break;
case 7:printf("中等\n");break;
case 6:printf("及格\n");break;
default:printf("不及格\n");
}
return 0;
}
程序运行结果:
root@ubuntu:/home/code# ./a.out
input a score: 100
卷神
root@ubuntu:/home/code# ./a.out
input a score: 55
不及格
这里需要注意的是,每个case分支的后面都要有一个break语句,用来结束当前的switch代码块,跳转到return 0;这条语句。如果你没有在case分支的后面加break,它会从case的入口处一直向下执行,知道遇到break或到达代码块的}处为止。
int main(void)
{
int score;
printf("input a score: ");
scanf("%d", &score);
switch(score/10)
{
case 10:printf("卷神\n");break;
case 9:printf("优秀\n");
case 8:printf("良好\n");
case 7:printf("中等\n");
case 6:printf("及格\n");break;
default:printf("不及格\n");
}
return 0;
}
在上面的程序中,我们把case 9、case 8、case 7分支后面的break语句删去了,此时再去运行程序,输入99:
root@ubuntu:/home/code# ./a.out
input a score: 99
优秀
良好
中等
及格
你会发现,程序从case 9分支入口,会一直执行下去,直到遇到case 6分支的break语句才停止。
switch-case的这种特性并不是一无是处,有时候我们可以利用这个特性来设计程序:比如现在成绩的等级改变了,删除了卷神这个等级,只有优秀、良好、中等、及格、不及格五个等级。此时的程序我们可以这样写:
int main(void)
{
int score;
printf("input a score: ");
scanf("%d", &score);
switch(score/10)
{
case 10:
case 9:printf("优秀\n");break;
case 8:printf("良好\n");break;
case 7:printf("中等\n");break;
case 6:printf("及格\n");break;
default:printf("不及格\n");
}
return 0;
}
我们将case 10分支后面的语句和break都删去,当用户输入100时,从case 10入口进入后,会接着往下执行,执行case 9的代码块。此时,无论用户输入的是100还是99,成绩显示的都是“优秀”。
使用switch-case语句还需要注意的一个地方是:switch(表达式)中的表达式的值只能是整型或者枚举。