C语言提供了一种用于多分支选择的switch语句 其一般形式为
switch(表达式){case 常量表达式1:语句1; break;case 常量表达式2:语句2; break;....case 常量表达式n:语句n; break;default:语句;break;}
它的意思是计算表达式的值。并逐个与其后的常量表达式值相比较当表达式的值与某个常量表达式的值相等时即执行其后的语句然后不再进行判断继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时则执行default后的语句。处理流程图如下
使用switch语句的规则是
1、switch语句的判断条件可以接受int,byte,char,short,枚举不能接受其他类型。
2、在case后的各常量表达式的值不能相同否则会出现错误。
3、在case后允许有多个语句可以不用{}括起来。
4、各case和default子句的先后顺序可以变动而不会影响程序执行结果。
5、default就是如果没有符合的case就执行它default并不是必须的。
6、在都没有break 语句的情况下首先会在所有的case 语句中寻找满足条件的语句。如果找到会从该语句顺序向下执行每个语句若找不到会从第一段开始向下顺序执行每一段语句。
7、在有break 语句的情况下找到一个满足条件的case 语句执行若找不到会执行default 的语句。
比如下面的例子
#include int main(void){inta;printf("请输入一个整型数字\n");scanf("%d",switch(a){case1:printf("Monday\n");case2:printf("Tuesday\n");case3:printf("Wednesday\n");case4:printf("Thursday\n");case5:printf("Friday\n");case6:printf("Saturday\n");case7:printf("Sunday\n");default:printf("输入错误\n");}system("pause");return0;}
运行结果
本程序是要求输入一个数字输出一个英文单词。但是当输入3之后却执行了case3以及以后的所有语句输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中“case 常量表达式”只相当于一个语句标号表达式的值和某标号相等则转向该标号执行但不能在执行完该标号的语句后自动跳出整个switch 语句所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的应特别注意。
为了避免上面的情况我们需要用到break语句专用于跳出switch语句break 语句只有关键字break没有参数。在后面还将详细介绍。修改例题的程序在每一case语句之后增加break 语句使每一次执行之后均可跳出switch语句从而避免输出不应有的结果。
修改后的代码
#include int main(void){inta;printf("请输入一个整型数字\n");scanf("%d",switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursday\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;case7:printf("Sunday\n");break;default:printf("输入错误\n");}system("pause");return0;}
执行结果
可以看到运行结果正常了。
switch语句不是必不可缺的显然可以用一组if..elseif...else if...else代替但是一方面用switch语句会使代码更清晰另一方面有时候编译器会对switch语句进行整体优化使它比等价的if/else语句所生成的目标代码效率更高。
使用switch语句要注意几点
1、case后面跟的必须是常量表达式因为这个值必须在编译时计算出来。
2、在C语言中浮点型是不能精确比较相等不相等的。因此C语言规定case后面跟的常量表达式的值必须是可以精确比较的整型或字符型。
3、进入case后如果没有遇到break语句就会一直往下执行后面其它case或default下面的语句也会被执行到直到遇到break或者执行到整个switch语句块的末尾。通常每个case后面都要加上break语句但有时候故意不加break来利用这个特性
下面是使用switch语句的三种情况。
1、标准型(case后面都有break语句)
#include int main(void){inti 3;switch(i){case1:printf("%d\n",1);break;case2:printf("%d\n",2);break;case3:printf("%d\n",3);break;default:printf("%s\n","default");break;}system("pause");return0;}运行结果:
2、特殊型1(不是完全有break语句,可以完成一些特殊应用)
#include int main(void){intyear 2014;intmonth 6;intday;switch(month){case1:case3:case5:case7:case8:case10:case12:day 31;break;case2:day 28;break;case4:case6:case9:case11:day 30;break;}printf("%d\n",day);system("pause");return0;}
运行结果
3、特殊型2(default的位置)
#include int main(void){inti 1;switch(i){case1:printf("%d\n",1);default:printf("%s\n","default");case2:printf("%d\n",2);break;case3:printf("%d\n",3);break;}system("pause");return0;}
运行结果