首页 > 编程笔记 > C语言笔记 阅读:23

C语言switch case分支语句的用法(非常详细)

在实际问题中,常需要用到多分支的选择。当然,使用嵌套的 if 语句也可以实现多分支选择,但如果分支较多,就会使得嵌套的 if 语句层数过多,程序冗余,可读性也不好。

C语言中可以使用 switch 语句直接处理多分支选择的情况,将程序代码的可读性提高。

switch 语句是多分支选择语句。一般形式如下:
switch(表达式)
{
    case 情况1:
        语句块1;
    case 情况2:
        语句块2;
    ...
    case 情况n:
        语句块n;
    default:
        默认语句块;
}
switch 语句的执行流程如下图所示:


图 1 switch多分支选择语句流程图

switch 后面的表达式就是要进行判断的条件,然后使用 case 关键字表示检验条件符合的各种情况,其后的各语句块是相应的操作。其中还有一个 default 关键字,作用是如果没有符合条件的情况,那么执行 default 后的默认情况语句。

switch 语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而 case 语句检验的值必须是整型常量,即常量表达式或者常量运算。

下面通过示例代码分析一下 switch 语句的使用方法:
switch(selection)
{
    case 1:
        printf("Processing Receivables\n");
        break;
    case 2:
        printf("Processing Payables\n");
        break;
    case 3:
        printf("Quitting\n");
        break;
    default:
        printf("Error\n");
        break;
}
首先 switch 判断 selection 变量的值,然后利用 case 语句检验 selection 值的不同情况。

假设 selection 的值为 2,那么执行 case 为 2 时的情况,执行后跳出 switch 语句。如果 selection 的值不是 case 中所列出的情况,那么执行 default 中的语句。

在每一个 case 或 default 语句后都有一个 break 关键字。break 语句用于跳出 switch 结构,不再执行下面的代码。

注意在 switch 语句中,如果所有 case 后面的值都不能匹配 switch 语句的条件,就执行 default 语句后面的代码。其中,任意两个 case 语句都不能使用相同的常量值;每个 switch 结构只能有一个 default 语句,而且 default 可以省略。

【实例】某大型商超为答谢新老顾客,当累计消费金额达到一定数额时,顾客可享受不同的折扣。
根据顾客购物小票上的消费金额,在控制台上输出该顾客将会享受的折扣与打扣后需要支付的金额。用 switch 语句来判断打折后的金额,具体代码如下:
#include <stdio.h>
int main()
{
    float money = 1026, m; /*定义变量 money 为购物金额,m 为打折之后的费用*/
    float rebate = 0.0f; /*定义折扣变量*/
    int grade = (int)money / 500; /*计算折扣等级*/
    switch (grade) /*根据等级计算打折后的金额*/
    {
        case 0: /*未满 500 元*/
            rebate = 0.0f; /*折扣为 0*/
            m = money; /*原价购买*/
            break; /*跳出*/
        case 1: /*刚好满 500 元*/
            rebate = 0.9f; /*折扣为 9 折*/
            m = money * rebate; /*计算折扣之后的费用*/
            break; /*跳出*/
        case 2: /*满 1000 元*/
            rebate = 0.8f; /*折扣为 8 折*/
            m = money * rebate; /*计算折扣之后的费用*/
            break; /*跳出*/
        case 4: /*满 2000 元*/
            rebate = 0.7f; /*折扣为 7 折*/
            m = money * rebate; /*计算折扣之后的费用*/
            break; /*跳出*/
        case 6: /*满 3000 元*/
            rebate = 0.6f; /*折扣为 6 折*/
            m = money * rebate; /*计算折扣之后的费用*/
            break; /*跳出*/
        default: /*折扣为 5 折*/
            rebate = 0.5f; /*计算折扣之后的费用*/
            m = money * rebate;
            break;
    }
    printf("原价是: %f\n 顾客将享受的折扣: %f\n", money, rebate); /*输出原价和对应折扣*/
    printf("打折后需支付的金额: %f\n", m); /*输出折扣后所花费用*/
    return 0;
}
定义变量 grade 用来保存折扣等级。计算方法为“折扣等级=购物金额/500元”。

使用 switch 语句判断整型变量 grade,其中使用 case 关键字检验可能出现的级别情况,并且在每个 case 语句的最后使用 break 语句跳出。如果没有符合的情况,则会执行 default 默认语句。

在 case 语句表示的条件后有一个冒号“:”,在编写程序时不要忘记。

运行程序,显示效果如下图所示:

原价是: 1026.000000
顾客将享受的折扣: 0.800000
打折后需支付的金额: 820.799988


switch 语句中,每个 case 情况内都使用了 break 语句。如果不使用 break 语句,会出现什么情况呢?break 的作用是跳出 switch 语句,因此如果本例中没有 break 语句说明,程序后面的内容将会都执行。

为了验证猜测是否正确,将上面程序中的 break 注释掉,运行程序:

原价是: 1026.000000
顾客将享受的折扣: 0.500000
打折后需支付的金额: 513.000000

从运行结果可以看出,当去掉 break 语句后,将计算 default 下的语句,很明显是错误的。因此,break 语句在 case 语句中是不能缺少的。

【实例】如果是周末就是休息日,如果不是周末就要上班。同时,休息日可以是星期六,也可以是星期日,星期六我们可以和朋友去逛街,星期日我们可以陪家人在家。用 switch 语句来模拟此场景:
#include <stdio.h>
int main()
{
    int iDay = 0; /*定义变量 iDay 表示输入的日期*/
    printf("enter a day of week to get course:\n"); /*提示信息*/
    scanf("%d", &iDay); /*输入日期*/
    switch (iDay)
    {
        case 1: /*iDay 的值为 1 时*/
            printf("Have a meeting in the company\n");
            break;
        case 6: /*iDay 的值为 6 时*/
            printf("Go shopping with friends\n");
            break;
        case 7: /*iDay 的值为 7 时*/
            printf("At home with families\n");
            break;
        default: /*iDay 的值为其他情况时*/
            printf("Working with partner\n");
            break;
    }
    return 0;
}
在程序中,使用 switch case 进行检验时,不要忘记 case 检验的条件只能是常量或者常量表达式,而不能对变量进行检验。

运行程序,结果为:
enter a day of week to get course:
6
Go shopping with friends
初学 switch 语句时,很容易认为 break 是 switch 语句的一部分,是 switch 的必要条件。但是并不是这样,break 可以不与 switch 匹配。

C语言switch的高级用法

将某个 case 语句后的语句块及 break 去掉之后,可以设计出多路开关模式的 switch 语句。例如:
switch(表达式)
{
    case 1:
        语句 1
        break;
    case 2:
    case 3:
        语句 2
        break;
    ...
    default:
        默认语句
        break;
}
可以看到,如果在 case 2 后不使用 break 语句,那么符合 case 2 检验与符合 case 3 检验时的输出效果是一样的。也就是说,多路开关模式可使得多种检验条件执行同一个操作。

【实例】判断一年四季情况。在本实例中,要求使用 switch 语句判断输入的月份属于哪个季节。已知 3、4、5 月是春季,6、7、8 月为夏季,9、10、11 月为秋季,12、1、2 月为冬季。
#include <stdio.h>
int main()
{
    int month; /*定义变量 month 表示月份*/
    printf("please enter a month:\n"); /*提示信息*/
    scanf("%d", &month); /*输入月份*/
    switch (month) /*根据月份判断季节*/
    {
        /*多路开关模式*/
        case 3:
        case 4:
        case 5:
            printf("%d is spring\n", month); /*3,4,5 月是春季*/
            break;
        /*多路开关模式*/
        case 6:
        case 7:
        case 8:
            printf("%d is summer\n", month); /*6,7,8 月是夏季*/
            break;
        /*多路开关模式*/
        case 9:
        case 10:
        case 11:
            printf("%d is autumn\n", month); /*9,10,11 月是秋季*/
            break;
        /*多路开关模式*/
        case 12:
        case 1:
        case 2:
            printf("%d is winter\n", month); /*12,1,2 月是冬季*/
            break;
        default:
            printf("error!!!\n"); /*无此月份*/
    }
    return 0; /*程序结束*/
}
本例程序中使用多路开关模式,使得检测 month 的值为 3、4、5 这 3 种情况时,都会输出相同的结果。同时,利用 default 语句对不符合月份的数字输入,提示错误。

运行程序,结果为:

please enter a month:
4
4 is spring

C语言switch和if else的区别

if else 语句和 switch 语句都可根据不同的情况检验条件,并做出相应的判断。那么 if else 语句和 switch 语句有什么区别呢?下面从两者的语法和效率方面进行比较。

1) 语法的比较

使用时,if 需要配合 else 关键字,switch 需要配合 case 关键字;if 语句是先对条件进行判断,而 switch 语句是后进行判断。

2) 效率的比较

if else 结构对少量的检验,判断速度比较快。但是随着检验深度的增长,会逐渐变慢,并且也不容易进行后续的条件添加和扩充。

switch 结构中,除 default 默认情况外,对其他每一项 case 的检验速度都是相同的。default 默认情况比其他情况都快。

当需要判定的情况较少时,使用 if else 结构比使用 switch 结构检验速度快。也就是说,如果分支在 3 个或者 4 个以下,用 if else 结构比较好,否则应选择 switch 结构。

【实例】模拟给 10086 移动客服中心打电话,如果不是移动电话的用户,则提示“暂时无法提供服务”;如果是移动的用户,则提示“查询话费请拨 1,人工服务请拨 0”。用户输入 1 之后,显示话费余额。

使用 if else 语句和 switch 语句模拟此场景,代码如下:
#include <stdio.h>
int main()
{
    int telephone, num; /*定义两个变量,分别表示电话号码和选择的服务*/
    printf("请输入您要拨打的电话: "); /*提示输入电话号码*/
    scanf("%d", &telephone); /*输入电话号码*/
    if (telephone == 10086) /*判断是否为移动用户*/
    {
        /*是移动用户,则进行以下操作*/
        printf("你好,欢迎致电中国移动,客服将为您提供以下服务:查询话费请拨 1,人工服务请拨 0\n");
        scanf("%d", &num); /*输入一个数字*/
        switch (num) /*判断输入的数字*/
        {
            case 1: /*数字 1 表示查询话费*/
                printf("您的话费余额为 9.89 元\n");
                break;
            case 0: /*数字 0 表示人工服务*/
                printf("您好,欢迎使用移动客服业务,为了保证通话质量,您的通话将会被录音,谢谢合作。\n");
                break;
            default: /*输入其他数字*/
                printf("对不起,系统没有此业务。\n"); /*提示信息,无此业务*/
        }
    }
    else /*不是移动用户*/
    {
        printf("暂时无法提供服务"); /*提示信息,暂时无法提供服务*/
    }
    return 0;
}
首先,判断用户拨打的是否是 10086,只有两种可能,检验的条件少,所以使用 if else 语句更为方便。接下来判断用户选择的服务,就要对 2~3 种甚至更多种情况进行检验,由于检验条件比较多,所以使用 switch 语句比较合适。其中,case 语句用来判断用户输入的服务选项,default 语句用于在输入数字不符合条件时提示“暂时无法提供服务”。

运行程序,结果为:

请输入您要拨打的电话: 10086
你好,欢迎致电中国移动,客服将为您提供以下服务:查询话费请拨 1,人工服务请拨 0
0
您好,欢迎使用移动客服业务,为了保证通话质量,您的通话将会被录音,谢谢合作。

相关文章