20201026-成信大-C语言程序设计-20201学期《C语言程序设计B》C-关于switch的执行顺序
经验:编程一定要按规范来写。
注意:
很多编程语言,都提供的有这样的分支结构,但要注意差别
这里涉及到的有java的,也有C的
核心参考
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
switch语句有如下规则:
- switch语句中的变量类型只能为byte、short、int或者char。
- switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
- case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
- 当变量的值与case语句的值相等时,那么case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
- 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不必须要包含break语句。如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句。
- switch语句可以包含一个default分支,该分支必须是switch语句的最后一个分支
- default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。
正常写法,case按顺序来匹配,加上break,default置尾
int x = 2;
switch(x){
case 1:System.out.println("case 1");
break;
case 2:System.out.println("case 2");
break;
case 3:System.out.println("case 3");
break;
default:System.out.println("Default");
break;
}
程序输出:
case 2
异常写法,新手易入坑
int x = 2;
switch(x){
case 1:System.out.println("case 1");
case 2:System.out.println("case 2");
case 3:System.out.println("case 3");
default:System.out.println("Default");
}
程序输出
case 2
case 3
default
可以理解,一旦找到切入点,就可切入语句,从上到下按顺序执行下去,直到遇到break,才跳出
扭曲写法,邪门格式,无能考官直接卡死新手
int x = 4;
switch(x){
default:System.out.println("Default");
case 1:System.out.println("case 1");
case 2:System.out.println("case 2");
case 3:System.out.println("case 3");
}
程序输出
default
case 1
case 2
case 3
当switch中匹配不到切入点时,进入default,然后,邪门的地方出现了,切入之后,也会按照从上到下的顺序执行
表示难以理解,分析一下switch内执行过程:
- 拿到括号中的值,然后从case中逐一匹配,匹配到的话就切入进去,从上到下执行(不管语句是case下的还是default下),直到遇到break;
- 匹配不到case,如果有default,就进入default,然后按顺序从上到下执行,知道遇到break或结束;
闲到无能为力啊
/*
将default置于switch的开头
闲得蛋疼的程序员啊
关键是他还要在中间加上一个break;
这种程序员如果混进了团队,一定要打死,往死里打;
如果面试官这么整,吐他口水,他不配当面试官;
如果老师这样出题,那你只有入坑蹲好,不要乱动;
*/
#include <stdio.h>
int main(void)
{
int x = 4;
switch (x)
{
default:
printf("\nDefault");
case 1:
printf("\ncase 1");
case 2:
printf("\ncase 2");
break;
case 3:
printf("\ncase 3");
}
}
其它变态示例
常规顺序,无break,default每次都要执行
/*
1. 没有break语句,顺序从上往下匹配执行
2. 显然,每一次default都会执行
3. i从1增长到4,会有四个5累加到a,即20
4. i从1增长到4,其中1,2,3会有三次3累加,一次2累加,即11
5. 结果:31
坑死无数新手啊。。。。。
*/
#include <stdio.h>
int main(void)
{
int a = 0, i;
for (i = 1; i < 5; i++)
{
switch (i)
{
case 0:
case 3:
a += 2;
case 1:
case 2:
a += 3;
default:
a += 5;
}
}
printf("%d\n", a);
}
乱用default,不使用break,邪恶的代码,在工程团队中将被团队直接处死的程序员写的代码
/*
1. 没有break语句
default乱跳:顺序从上往下匹配执行
只要default执行了,它之后的群魔case也会搭车再执行一次【邪恶啊】
2. 显然,每一次default都会执行
显然,case 0 每一次都会搭default的车执行
3. 'china'里的字符,无论匹配不匹配,default和case 0 都会执行
4. 结果:5,5
坑死队友、新手啊。。。。。
*/
#include <stdio.h>
int main(void)
{
int v1 = 0, v2 = 0;
char ch;
while ((ch = getchar()) != '#')
{
switch (ch)
{
case 'a':
case 'h':
default:
v1++;
case '0':
v2++;
}
}
printf("%d,%d\n", v1, v2);
}
常规用法,但加入更多的循环、自增自减等运算,转移视线
/*
常规写法
1. 再加上++等运算,就让新手抓瞎了
2. i取9 10 11,最后i增长为12
3. i对10取商后,取的是0,1,1
其中只有0匹配一次,执行一次,m,n增1
4. i的三次取值,default因为有break在前
只会在1,1匹配不到时执行两次,k,n增2
5. 最终m,n,k为1,3,2
新手易入坑
*/
#include <stdio.h>
int main(void)
{
int i, m = 0, n = 0, k = 0;
for (i = 9; i <= 11; i++)
{
switch (i / 10)
{
case 0:
m++;
n++;
break;
case 10:
n++;
break;
default:
k++;
n++;
}
}
printf("%d %d %d\n", m, n, k);
}
后记:
事实证明,如果不认真学习switch,最容易栽在学校里的那场期末考试上啊。
这样变态的题,只有学校出得出来。公司不会搞出这样的题来招人。【有些时候并不是命题者无能,而是学生的学习越来越会参考书本之外的内容,多百度,多看CSDN,总会有新的收获,但总有人懒,不会看,嘻嘻。。。。题库不是普通人搞出来的,但普通人肯定会去用它】
另外,就是二级等级考试里【其实也是学校的人出的题】会搞出这样的妖蛾子。