switch语句是C语言中提供的一种用于多分支选择的语句 其基本用法如下;
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
…
case 常量表达式n: 语句n;
default: 语句n+1;
}
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。其中表达式的值可以是int,byte,char,short, enum这几种。
然而其在当表达式的值与某个常量表达式的值相等时, 将会执行其后全部的语句。这一点有时会产生不少错误。因此通常我们会在每个case的语句后加入一个break来跳出switch语句避免此后的语句被执行。
但是,这是为什么呢?为什么此后的语句会全部被执行?
在很多C语言教程中,switch语句后面跟着的一般都是臭名昭著的goto语句,而课本的这种安排方式是合理的,因为在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。
让我们看一段含有goto语句的代码
#include"stdio.h"
int main(void)
{
int n=0;
printf("input a string :\n");
loop: if(getchar()!='\n')
{
n++;
goto loop;
}
printf("%d",n);
}
再看看switch语句的
#include <stdio.h>
int main(void){
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;
}
两者完全相似,由于没学过汇编所以没法直接对比两者的汇编代码,不过估计实现方式是一样的。
因此,这样子的代码也是合理的了。
#include <stdio.h>
int main(void){
int a;
printf("input integer number: ");
scanf("%d",&a);
switch (a){
case 1:case 3:printf("123\n"); break;
case 2:case 4:case 5:printf("456\n"); break;
default:printf("789\n");
}
return 0;
}