C语言switch case语句的用法(非常详细,附带示例)
除了 if else,switch case 也是一种常用的选择结构,它会根据一个表达式的不同值,执行不同的代码块。C语言 switch case 语句的用法如下:
1) 先计算
2) 从第一个 case 开始,依次挨着往后比较,一旦遇到某个相等的
每个
3) 如果比较到最后也没有找到相等的
default 是可选择,你可以不写。如果没有 default 分支,也没有匹配的 case 分支,那么 switch 将什么都不执行。
注意,switch case 只能用来匹配整型值(包括 char 类型),不能匹配其它类型的值。虽然
在实际开发中,switch case 常用来替代简单的、拥有多个分支的 if else 语句。C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况,此时就可以尝试 switch case。
例如,输入一个整数,输出该整数对应的星期几的英文表示,我们可以用 if else 来实现:
为什么要使用 break 呢?因为 switch 有一个坏毛病,就是一旦发现
也就是说,switch 只会匹配一次,一旦匹配成功了,就会不管不顾地执行后面的代码,而不管其它 case 是否匹配。只有到达 switch 末尾,或者遇到 break 关键字,才会结束整个 switch 的执行。
贯穿往往不是我们所期望的,所以才在每个 case 的后面都加一个 break,这样在执行完当前分支以后就能强制跳出 switch 了。
至于 default 分支最后,加不加 break 都无所谓,因为它往往是 switch 的最后一个分支,有没有 break 都会结束整个 switch 的执行。
修改上面的代码,去掉 break 关键字,看看会发生什么情况:
不过,贯穿现象也不完全是坏事,我们也可以巧妙地利用贯穿现象,让多个 case 执行相同的代码。例如:
另外,虽然普通变量不能用在 case 后面,但是由 const 修饰的常量是可以的,这是因为 const 常量的值不能修改,在编译期间就能确定。
请看下面的例子:
示例1:使用 switch case 语句实现一个简单的加法器。
示例2:输入月份,输出季节。
switch (表达式) { case 整形常量1: //代码块 1 break; case 整形常量2: //代码块 2 break; ...... case 整形常量n: //代码块n break; default: //默认代码块 }switch case 语句的执行流程如下:
1) 先计算
表达式
的结果,然后将该结果与各个 case 后面的整形常量
进行比较,看它们的值是否相等。2) 从第一个 case 开始,依次挨着往后比较,一旦遇到某个相等的
整形常量
,就停止比较,并执行当前 case 后面的代码块
。每个
代码块
的后面都有一个 break 语句,用来“跳出”整个 switch 结构,防止继续执行下一个 case 分支;换句话说,一旦遇到 break 语句,整个 switch 结构就执行结束了。3) 如果比较到最后也没有找到相等的
整形常量
,那么就执行 default 后面的默认代码块
。default 是“默认”的意思,也就是当没有匹配的 case 分支时,默认执行的一个分支。换句话说,default 分支用来处理所有 case 都不匹配的情况,是负责“兜底”的。default 是可选择,你可以不写。如果没有 default 分支,也没有匹配的 case 分支,那么 switch 将什么都不执行。
注意,switch case 只能用来匹配整型值(包括 char 类型),不能匹配其它类型的值。虽然
表达式
的写法很灵活,可以是变量、常量、加减乘除运算、函数调用等,但它必须能够得到一个整型值。在实际开发中,switch case 常用来替代简单的、拥有多个分支的 if else 语句。C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况,此时就可以尝试 switch case。
例如,输入一个整数,输出该整数对应的星期几的英文表示,我们可以用 if else 来实现:
#include <stdio.h> int main() { int a; printf("Input integer number:"); scanf("%d", &a); if (a == 1) { printf("Monday\n"); }else if (a == 2) { printf("Tuesday\n"); }else if (a == 3) { printf("Wednesday\n"); }else if (a == 4) { printf("Thursday\n"); }else if (a == 5) { printf("Friday\n"); }else if (a == 6) { printf("Saturday\n"); }else if (a == 7) { printf("Sunday\n"); }else { printf("error\n"); } return 0; }这段代码看起来有点乱糟糟,如果用 switch case 语句来替换,就清晰多了:
#include <stdio.h> int main() { int a; printf("Input integer number:"); scanf("%d", &a); switch (a) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default: printf("error\n"); } return 0; }可能的运行结果:
Input integer number:4↙ Thursday或者:
Input integer number:9↙ error
关于 break
break 是C语言中的一个关键字,专门用来跳出 switch 语句(也可以跳出 for 循环和 while 循环)。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句,以及其它分支中的语句。也就是说,整个 switch 执行结束了,接下来会执行整个 switch 后面的代码。为什么要使用 break 呢?因为 switch 有一个坏毛病,就是一旦发现
表达式
的值和某个整形常量
匹配了,就会执行后面的所有代码,包括当前 case 分支的代码,以及它后面的其它 case 分支的代码。这种现象称为贯穿(fall through)。也就是说,switch 只会匹配一次,一旦匹配成功了,就会不管不顾地执行后面的代码,而不管其它 case 是否匹配。只有到达 switch 末尾,或者遇到 break 关键字,才会结束整个 switch 的执行。
贯穿往往不是我们所期望的,所以才在每个 case 的后面都加一个 break,这样在执行完当前分支以后就能强制跳出 switch 了。
至于 default 分支最后,加不加 break 都无所谓,因为它往往是 switch 的最后一个分支,有没有 break 都会结束整个 switch 的执行。
修改上面的代码,去掉 break 关键字,看看会发生什么情况:
#include <stdio.h> int main() { int a; printf("Input integer number:"); scanf("%d", &a); switch (a) { case 1: printf("Monday\n"); case 2: printf("Tuesday\n"); case 3: printf("Wednesday\n"); case 4: printf("Thursday\n"); case 5: printf("Friday\n"); case 6: printf("Saturday\n"); case 7: printf("Sunday\n"); default: printf("error\n"); } return 0; }运行结果:
Input integer number:3↙ Wednesday Thursday Friday Saturday Sunday error或者:
Input integer number:6↙ Saturday Sunday error显然,这不是我们想要的输出结果。
不过,贯穿现象也不完全是坏事,我们也可以巧妙地利用贯穿现象,让多个 case 执行相同的代码。例如:
switch (grade) { case 'A': case 'B': case 'C': printf("及格\n"); break; case 'D': case 'F': printf("不及格\n"); break; default: printf("无效的成绩\n"); }
关于 case
case 后面除了可以跟整形常量,还可以跟结果是整型的常量表达式,这意味着表达式的值在编译期间就能确定,而不用等到运行时计算得出。另外,虽然普通变量不能用在 case 后面,但是由 const 修饰的常量是可以的,这是因为 const 常量的值不能修改,在编译期间就能确定。
请看下面的例子:
int a = 60; const int b = 5; case 10: printf("..."); break; //正确 case 8+9: printf("..."); break; //正确,8+9 的值在编译期间就能算出 case 'A': printf("..."); break; //正确,字符和整数可以相互转换 case 'A'+19: printf("..."); break; //正确,字符和整数可以相互转换 case 9.5: printf("..."); break; //错误,不能为小数 case a: printf("..."); break; //错误,不能包含变量 case a+10: printf("..."); break; //错误,不能包含变量 case b+2: printf("..."); break; //正确,b+2 的值在编译期间就能算出
综合示例
我们通过两个综合的例子,全面地展示一下 switch case 语句的用法。示例1:使用 switch case 语句实现一个简单的加法器。
#include <stdio.h> int main() { char symbol; double num1, num2, result; printf("输入一个运算符 (+, -, *, /): "); scanf("%c", &symbol); printf("输入两个数字: "); scanf("%lf %lf", &num1, &num2); switch (symbol) { case '+': result = num1 + num2; printf("%.2lf + %.2lf = %.2lf\n", num1, num2, result); break; case '-': result = num1 - num2; printf("%.2lf - %.2lf = %.2lf\n", num1, num2, result); break; case '*': result = num1 * num2; printf("%.2lf * %.2lf = %.2lf\n", num1, num2, result); break; case '/': if (num2 != 0) { result = num1 / num2; printf("%.2lf / %.2lf = %.2lf\n", num1, num2, result); } else { printf("错误!除数不能为零。\n"); } break; default: printf("错误!无效的运算符。\n"); } return 0; }运行结果:
输入一个运算符 (+, -, *, /): + 输入两个数字: 20 837 20.00 + 837.00 = 857.00
示例2:输入月份,输出季节。
#include <stdio.h> int main() { int month = 0; printf("输入月份:"); scanf("%d", &month); switch (month) { case 12: case 1: case 2: printf("冬季\n"); break; case 3: case 4: case 5: printf("春季\n"); break; case 6: case 7: case 8: printf("夏季\n"); break; case 9: case 10: case 11: printf("秋季\n"); break; default: printf("无效的月份\n"); } return 0; }运行结果:
输入月份:9 秋季