C语言switch case分支语句的用法(非常详细)
在实际问题中,常需要用到多分支的选择。当然,使用嵌套的 if 语句也可以实现多分支选择,但如果分支较多,就会使得嵌套的 if 语句层数过多,程序冗余,可读性也不好。
C语言中可以使用 switch 语句直接处理多分支选择的情况,将程序代码的可读性提高。
switch 语句是多分支选择语句。一般形式如下:

图 1 switch多分支选择语句流程图
switch 后面的表达式就是要进行判断的条件,然后使用 case 关键字表示检验条件符合的各种情况,其后的各语句块是相应的操作。其中还有一个 default 关键字,作用是如果没有符合条件的情况,那么执行 default 后的默认情况语句。
switch 语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而 case 语句检验的值必须是整型常量,即常量表达式或者常量运算。
下面通过示例代码分析一下 switch 语句的使用方法:
假设 selection 的值为 2,那么执行 case 为 2 时的情况,执行后跳出 switch 语句。如果 selection 的值不是 case 中所列出的情况,那么执行 default 中的语句。
在每一个 case 或 default 语句后都有一个 break 关键字。break 语句用于跳出 switch 结构,不再执行下面的代码。
注意在 switch 语句中,如果所有 case 后面的值都不能匹配 switch 语句的条件,就执行 default 语句后面的代码。其中,任意两个 case 语句都不能使用相同的常量值;每个 switch 结构只能有一个 default 语句,而且 default 可以省略。
【实例】某大型商超为答谢新老顾客,当累计消费金额达到一定数额时,顾客可享受不同的折扣。
根据顾客购物小票上的消费金额,在控制台上输出该顾客将会享受的折扣与打扣后需要支付的金额。用 switch 语句来判断打折后的金额,具体代码如下:
使用 switch 语句判断整型变量 grade,其中使用 case 关键字检验可能出现的级别情况,并且在每个 case 语句的最后使用 break 语句跳出。如果没有符合的情况,则会执行 default 默认语句。
在 case 语句表示的条件后有一个冒号“:”,在编写程序时不要忘记。
运行程序,显示效果如下图所示:
switch 语句中,每个 case 情况内都使用了 break 语句。如果不使用 break 语句,会出现什么情况呢?break 的作用是跳出 switch 语句,因此如果本例中没有 break 语句说明,程序后面的内容将会都执行。
为了验证猜测是否正确,将上面程序中的 break 注释掉,运行程序:
【实例】如果是周末就是休息日,如果不是周末就要上班。同时,休息日可以是星期六,也可以是星期日,星期六我们可以和朋友去逛街,星期日我们可以陪家人在家。用 switch 语句来模拟此场景:
运行程序,结果为:
【实例】判断一年四季情况。在本实例中,要求使用 switch 语句判断输入的月份属于哪个季节。已知 3、4、5 月是春季,6、7、8 月为夏季,9、10、11 月为秋季,12、1、2 月为冬季。
运行程序,结果为:
switch 结构中,除 default 默认情况外,对其他每一项 case 的检验速度都是相同的。default 默认情况比其他情况都快。
当需要判定的情况较少时,使用 if else 结构比使用 switch 结构检验速度快。也就是说,如果分支在 3 个或者 4 个以下,用 if else 结构比较好,否则应选择 switch 结构。
【实例】模拟给 10086 移动客服中心打电话,如果不是移动电话的用户,则提示“暂时无法提供服务”;如果是移动的用户,则提示“查询话费请拨 1,人工服务请拨 0”。用户输入 1 之后,显示话费余额。
使用 if else 语句和 switch 语句模拟此场景,代码如下:
运行程序,结果为:
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 可以省略。
【实例】某大型商超为答谢新老顾客,当累计消费金额达到一定数额时,顾客可享受不同的折扣。
- 累计未满 500 元,当前消费不享受任何折扣优惠;
- 累计满 500 元,当前消费可享 9 折优惠;
- 累计满 1000 元,当前消费可享 8 折优惠;
- 累计满 2000 元,当前消费可享 7 折优惠;
- 累计满 3000 元,当前消费可享 6 折优惠;
- 累计 3000 元以上,当前消费可享 5 折优惠。
根据顾客购物小票上的消费金额,在控制台上输出该顾客将会享受的折扣与打扣后需要支付的金额。用 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
【实例】如果是周末就是休息日,如果不是周末就要上班。同时,休息日可以是星期六,也可以是星期日,星期六我们可以和朋友去逛街,星期日我们可以陪家人在家。用 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
您好,欢迎使用移动客服业务,为了保证通话质量,您的通话将会被录音,谢谢合作。