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
您好,欢迎使用移动客服业务,为了保证通话质量,您的通话将会被录音,谢谢合作。
ICP备案:
公安联网备案: