switch语句的简单介绍
switch语句是一种分支语句,常用于多分支的情况
一般如果我们不想用if...else if.....if这种复杂的结构时,就会想到使用其他不一样的语法形式,这就是switch语句,格式如下
switch(整形表达式) { 语句项; } 注意:此时switch括号中只能放除了float,double的整形变量
那么语句项是什么意思呢?
case 整型常量表达式; 语句;
switch语句中的break语句
在switch语句中,我们没法直接实现分支,搭配break使用才能真正实现分支。
比如:思考下面的语句用switch语句要如何实现呢?
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七
实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int day; 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; } return 0; }
分析:此时我们便使用了break语句,break语句的实际效果是把语句列表划分为不同的部分,建议在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
switch语句中的default子句
如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没什么,结果就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
此时可以在语句列表中增加一条default子句,把标签 default:可以写在任何一个case标签可以出现的位置。 当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
介绍完上述概念后,现在我们来做下练习,分析下列代码并给出输出结果.
代码一:此时我们若将case1中的break语句去掉的话,此时我们若输入a=1时,会输出什么呢?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int a = 0; scanf("%d",&a); switch (a){ case 1: printf("1\n"); case 2: printf("2\n"); break; /*如果去掉此break,则输出结果为1 2,因为去掉后会按照顺序执行,寻找break语句跳出,从而从case2跳出去*/ case 3: printf("3\n"); break; default : printf("输入有误\n"); break; } return 0; }
此时会输出1和2,原因是去掉后便会按顺序继续执行case语句,当遇到下一个带有break的case语句时便会跳出,此时case1中不带有break语句,则会继续往下执行到case2语句,而case2语句中带有break语句,此时便可以进行跳出了,最终输出1和2.
输出结果为:
代码二: 此时m和n最后的输出结果是多少呢?
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n);//输出结果为m=5,n=3 return 0; }
分析:此段代码的输出结果为m=5,n=3,原因是此时的执行顺序为首先n=2,则switch语句中执行case1语句,m++后m=3,此时继续执行case2语句,n++后n=2,此时继续执行case3中嵌套的switch语句(switch语句中是允许嵌套的),此时n=2,那么执行case2,m++后m=4,n++后n=3,遇到break语句后跳出当前的switch语句,但是此时原本外层嵌套的case3语句中并没有break语句,则继续往下执行case4语句,m++后m=5,遇到break语句此时跳出外面嵌套的switch语句,此时最终m=5,n=3.
输出结果为:
代码三:思考此时我们若输入a=1时,会输出什么?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int a = 0; scanf("%d", &a); switch (a){ case 2: printf("2\n"); break; case 1:/*此时若将a输入成1,则此时并不会执行case2 语句,会依次往下执行,直到找到break语句跳出*/ printf("1\n"); //break; case 3: printf("3\n"); break; default: printf("输入有误\n"); break; } return 0; }
分析:此时当我们输出a=1时,并不会执行case2语句,而会依次往下执行,直到找到break语句跳出,那么此时跳转到case1语句输出1,但case1语句并没有break跳出语句,则继续执行case3语句,输出3后遇到break语句跳出,那么此时输出结果为1,3.
输出结果为: