选择程序结构:switch-case

加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/

当程序中的分支过多时,如果此时还是用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(表达式)中的表达式的值只能是整型或者枚举

专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程