继上一篇文章,留下了switch语句的悬念,现在让我们来揭开它的面纱。
switch语句格式:
switch(表达式)
{
case 常量1:
程序段1;
case 常量2:
程序段2;
.
.
.
case 常量n:
程序段n;
default:
程序段n+1;
}
这就是switch语句在程序中的样子。看到它,你应该和我有一样的感受,对没错,就是它的结构感特别强,这也是我对switch语句最大的感受。
举个最简单的例子,假如“switch”是一个星期,后面的括号指代着某一天,括号内会包括7个case语句和一个default语句,分别对应着星期一到星期日,还有一个处理输入异常数据的部分:
int input = 0;
scanf("%d",&input);
switch(input)
{
case 1:
printf("今天是星期一!\n");
case 2:
printf("今天是星期二!\n");
case 3:
printf("今天是星期三!\n");
case 4:
printf("今天是星期四!\n");
case 5:
printf("今天是星期五!\n");
case 6:
printf("今天是星期六!\n");
case 7:
printf("今天是星期七!\n");
default:
printf("明知道是在说星期,就不要输入除1-7之外的数字啦!\n");
}
看起来还不错吧,是不是一目了然,大功告成!了么?稍后再说,先让我们解析一下switch语句中的一些细节:
1、根据语法格式,case语句后面要跟常量,既然是常量,那就包括常量整形和常量字符。包不包括常量字符串呢(java中是可以的哦)?可以自己去试验一下。
2、可以看出,每一个case都代表着你想表达的内容的各个不同情况,既然是不同,那么,各个case后面的常量值必须互异。
3、其实case分支中的程序段还有一个特点的,可是上述代码没有体现出来,稍后再说。
4、说到这一点,我想问一下,上面的代码真的大功告成、天衣无缝了么?并不是,不信你可你可以去自己运行一下,会出现你意想不到的效果。
switch语句也是一个分支,那么得到的答案应该是其中的一个,可是,上述代码并没有语句来退出switch,他就会从你选择到的分支顺着代码往下执行一直到switch语句结束,这显然不是我们想要的结果,所以这个时候就需要我们使用break(它也是一个关键字哦,不要试图用这个名字来创建变量!)语句,来退出switch!
int input = 0;
scanf("%d",&input);
switch(input)
{
case 1:
printf("今天是星期一!\n");
break;
case 2:
printf("今天是星期二!\n");
break;
case 3:
printf("今天是星期三!\n");
break;
case 4:
printf("今天是星期四!\n");
break;
case 5:
printf("今天是星期五!\n");
break;
case 6:
printf("今天是星期六!\n");
break;
case 7:
printf("今天是星期七!\n");
break;
default:
printf("明知道是在说星期,就不要输入除1-7之外的数字啦!\n");
}
这回看着就舒服多了,没错,这回真的大功告成了!
这时候,我们再说回第三点,我们都知道C语言编写代码时的一个规范,一个代码块里要是只有一条语句,则可以省略大括号;若是超过了两条,那就必须用大括号括起。我们把这个规范拿到上述代码中我们可以发现,case后面的代码块,共有两条语句,为什么不把他括起来?
原因很简单,因为:case分支中的程序段可包含多条语句,且不用“{}”。
5、可以看到里面除了一堆case还包括一个default,英译汉:默认,没错,他就是默认情况,默认着你输入的内容和每一个case都对应不上的情况,这么说就很好理解了吧!
6、最后一点了,真的最后一个特点了,没想到如此简单的switch语句能写出这么多内容吧。还记得我们为什么要用break来结束switch语句么?那我们可不可以利用那一点去完成一些别的功能呢?当然可以,因为,多个case可以共用同一个程序段呀:
//1年分12个月,12个月分为4个季度
switch(month) //1-12
{
case 1:
case 2:
case 3:
printf("一、二、三月是一年的春季\n");
break;
case 4:
case 5:
case 6:
printf("四、五、六月是一年的夏季\n");
break;
case 7:
case 8:
case 9:
printf("七、八、九月是一年的秋季\n");
break;
case 10:
case 11:
case 12:
printf("十、十一、十二月是一年的冬季\n");
break;
default:
printf("一年就十二个月,不要输入除1-12的其他数字,要不我会笑话你的!\n");
}
一目了然吧,可以自己尝试着写一下哦!
但是这里我要提出一个疑问,它虽然有着让人一目了然的结构性,但是是不是代码的篇幅有些过于冗长了?它和if语句的区别是什么呢?
要我说,没区别,就是具体情况具体分析,当然采用哪种分支语句都是可以的,存在即合理。
考虑一下,模拟一个简易计算器,用户输入两个数字和一个运算符,实现+、-、*、/的计算,这时候你会采用if语句还是switch语句呢?