switch case组合
基本语法结构
switch(整型常量/整型变量/整型表达式){
case var1:
break;
case var2:
break;
case var2:
break;
default:
break;
}
不要拿青龙偃月刀去削苹果
既然已经有了if else 分支语句,那为什么还要switch 语句呢?
switch 语句也是一种分支语句,常常用于多分支的情况。这种多分支,一般指的是很多很多分支,而且判定条件主要以整型为主:
如:输入数字,输出相应的星期几
#include <stdio.h>
int main()
{
int day = 0;
do
{
printf("请输入:>");
scanf("%d", &day);
switch (day) {
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;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
} while (day);
return 0;
}
以上的程序,如果用if else 来写,会非常的繁琐!
case的作用是什么?
case 本质是进行判定功能,与switch 里面的语句相比较,如果相同,则执行语句,不相同则找下一个case 比较,直至所有case 语句都不与switch 相同,此时执行default 语句。
case 决定了从哪开始执行语句,所以说case 是判定功能
break的作用是什么?
break 本质是执行分支功能
具体效果看上面图片
那如果没有break 会发生什么呢?
#include <stdio.h>
int main()
{
int day = 0;
do
{
printf("请输入:>");
scanf("%d", &day);
switch (day) {
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期七\n");
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (day);
return 0;
}
我们删除了1-4 的break ,看效果
可以看到,当我们输入1 的时候,case 1 开始执行,然后case 2 竟然也执行了,后续也执行,直到星期五结束后,没再执行。
当我们输入2 的时候,从case 2 开始执行,直到星期五结束。
可以发现,1-4 没有break ,而5 有break ,所以输出星期五执行,再执行break ,就不再执行下面的语句了。
这恰恰说明了上面case 的作用:决定了从哪开始执行语句。
但是现在的重点是break ,可以发现当没有break 时,会继续执行下一条case 语句,当遇到break 时,不再执行。
这恰恰就是break 的分支功能。
其实switch 语句是没有任何功能的,真正使得switch 结构实现类似if else 功能的是由于case 和break 语句的配合。
上面的程序还可以改造成如下:
//这就是多个不同的case,想执行同一条语句的做法
#include <stdio.h>
int main()
{
int day = 0;
do
{
printf("请输入:>");
scanf("%d", &day);
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("周内\n");
break;
case 6:
case 7:
printf("周末\n");
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (day);
return 0;
}
关于break 还有一个很容易混淆的地方,就是一般人在一般情况下在case 后面要么不写break ,要么只写break ,万不得已不要写其它,特别是return ,极易有可能使得用户在调试时忽略,从而不能发现问题所在!!!
case后面的值有什么要求吗?
switch 语句必须是整型常量/整型变量/整型表达式
不能够是有效的布尔值,
int x = 10;
switch (0 == x)//因为这样得表达式,结果只有0/1,下面的case也只能是0/1才能够与之匹配
{
default:
break;
}
case 语句必须是整型常量/整型常量表达式,类似const 修饰的常量称为只读变量也不可以!
case语句的排列顺序问题
按字母或数字顺序排列各条case 语句
就像上面的程序,当所有case 语句作用相当,没有什么特别的重要性差别时,一般按顺序排列case 语句,像1、2、3、4或者A、B、C、D等等。
把正常情况放在前面,而把异常情况放在后面
也如同上面的程序,我们把正常的星期一到星期七写在前面,而把退出写在最后。
按执行频率排列case 语句
将使用频率高的case 语句放在前面,就如同把畅销货放在售卖最显眼的地方一样。这样可以使得我们在调试(一般是频率较高的)时,能快速的找到该case 语句。
default语句相关问题
先说一句,default 语句可写可不写,但是,强烈建议无论如何都写上。这就谈到default 语句的作用了。
作用:当所有的case 语句都不与switch 语句匹配时,这时执行default 语句。强烈建议写在最后!!!
default 语句的位置是非常自由的
但是有一点,当case 入口已开启,且没有break ,且default 紧随其后,也是会执行default 语句的
但是还要再说一遍:强烈建议无论如何都加上default 语句,并且写在最后!!!
使用case语句的一些注意事项
简化每种情况对应的操作
也就是说,在case 语句和break 语句中间的语句,越简洁越好,
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("hello world!\n");
printf("hello world!\n");
printf("hello world!\n");
printf("hello world!\n");
break;
case 2:
break;
case 3:
break;
default:
break;
}
return 0;
}
假设case 中有四条语句,尽量将这些语句封装成一个函数,使得case 中的语句尽量简洁
#include <stdio.h>
void show() {
printf("hello world!\n");
printf("hello world!\n");
printf("hello world!\n");
printf("hello world!\n");
}
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
show();
break;
case 2:
break;
case 3:
break;
default:
break;
}
return 0;
}
还有一点,在case 后定义变量是不可以的,如果非要定义变量,那么就得加{}
当然了,即使是这样的写法,也是非常不建议的,强烈建议封装成函数!!! 不要为了使用case语句而刻意制造一个变量
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++) {
int tmp = i;//这里的tmp就是刻意制造的变量,非常不建议这样干
switch (tmp)
{
default:
break;
}
}
return 0;
}
应该是这样
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++) {
switch (i)//这样会比上面好很多
{
default:
break;
}
}
return 0;
}
default子句只用于检查真正的默认情况
有时候,只剩下最后一种情况需要处理,但是你却偷懒,没有用case 处理这种情况,而是交给了default ,这样是非常不妥的,比如说,上面那个星期一到星期七的程序,我们只用case 处理了星期一至六,而把星期七交给了default 是非常不好的。因为这样将失去case 语句的标号所提供的自说明功能,而且丧失了使用default 子句处理错误情况的能力。所以我们不能够偷懒去少写代码,而应该真正用case 处理每一种情况,而将真正的默认情况交给defualt 比如说输入错误。
|