[简明C语言]分支和循环P_2:分支 - switch语句
前言
第二章:分支和循环
分支语句,也叫条件判断语句。
switch语句从字面上讲,可以称为开关语句,当然理解上不要以为就只有开和关,可以想象它是一个多路开关。它是一种多分支结构。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七
用if…else if…else if的形式的表达太过复杂,所以要使用一种不一样的语法形式。这就是switch语句。
swtich语句
switch语句是一种流控制语句,用于多种选择判断。当表达式值等于所设置值的时候则执行后面的语句。可用break关键字跳出switch语句。
用一段伪代码来描述模块结构图:
switch(整型表达式)
{
语句项;
}
语句项
而语句项是什么呢?
//是一些case语句:
//如下:
case 整型常量表达式;
语句;
那么给定语句项,下面这段代码会输出什么呢?
#include <stdio.h>
int main()
{
int day = 0;
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");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
//没有break语句
}
return 0;
}
当输入值为1时,来看看运行结果:
可以发现当输入1的时候,打印出的结果却是全部的case。
这是因为在case1输出后,没有什么阻止它停下时,就会一直向后输出,直到输出所有case语句。
输入值改为2呢?
可以发现当输入2的时候,打印出了从星期二开始向后的所有case。
所以决定入口
的,是表达式和case后的值。
如果想要达到预期的分支效果,也就是输入什么,就输出对应的选项,那么应该怎么做呢?
break语句
在switch语句中,我们没法直接实现分支,搭配break
使用才能实现真正的分支:
#include <stdio.h>
int main()
{
int day = 0;
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;
}
运行结果:
case决定入口,break决定出口。
每个case后加入了break语句后,当输入3
时,打印的结果为星期三
,达到了预期的效果。
但是,不是每一个case后面都需要break,上述例子中需要加入break只是需要符合逻辑!
这样就实现了真正的分支!
多个case值对应一个执行语句
如果想要输入1-5时输出工作日
,输入6-7时输出休息日
。
代码如下:
#include <stdio.h>
int main()
{
int day = 0;
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;
}
return 0;
}
当输入4的时候,运行结果为工作日:
可以看出,case后是否加break
并不是语法规定的,而是根据自身的需求来的。
注:最后一个case也要添加
break
!
【编程好习惯】
这样写可以避免在以前的一个case语句后面继续编写时,忘了添加break语句的情况。
如果一个没有规定的未知字符被传递给这条switch语句,会出现什么情况呢?
对上述例子输入9,运行结果:
可以看到当输入9时,程序没有任何输出。为了获得反馈,在此加入一个default子句
,以处理这种情况。
default子句
表达的值与所有的case标签的值都不匹配时,所有的语句都被跳过。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
可以在语句列表中增加一条default子句
。
switch语句是一个条件选择语句,首先会找到满足条件的case值做为执行后面的程序入口;若所有的case都不满足,则找default入口,若未找到则退出整个switch语句;所以default只是一个备用的入口,有没有都无所谓。
为了进行错误检查或逻辑检查,还是应该在switch语句中加入default子句
:
#include <stdio.h>
int main()
{
int day = 0;
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;
default:
(printf("输入错误\n"));
break;
}
return 0;
}
此时输入9,运行结果为:
此时打印出了“输入错误”,对检查到的错误给出了一个反馈。
注:
default子句
可以放在任何一个case标签可以出现的位置。
语句流会像执行一个case标签一样执行default子句
。
一般默认放在最后。
注:最好在每个switch语句中都放一条default子句!甚至可以在后边再加一个break!
【编程好习惯】
这样写可以给逻辑检查带来很多方便。
要求整型
1. swtich后要求输入一个整型表达式。
- 如果想放一个浮点型会怎样呢?
会报错!
表达式必须包含整型
!
2. case后要求输入一个整型常量表达式。
-
如果想放一个浮点型会怎样呢?
也会报错!
表达式必须为整型
表达式! -
如果想放一个变量会怎样呢?
还是会报错!
表达式必须含有常量值
!
注:字符型是整型的一种。
字符对应的整数由ASCII码值
规定。
练习一:嵌套switch语句
以下代码的运行结果是什么?
#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);
return 0;
}
运行结果为:
m = 5,n = 3是怎么得到的呢?
观看注释:
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n)//n的值是1,执行case1 { case 1://从case1进入 m++;//m = 3 //没有break!!继续执行case2 case 2: n++;//n = 2 //没有break!!继续执行case3 case 3://进入嵌套switch语句 switch (n)//n的值是2,执行case2 { case 1://case1不执行 n++; case 2://从case2进入 m++;//m = 4 n++;//n = 3 break;//此处的break跳出【嵌套的switch语句】!! } //跳出【嵌套的switch语句】后,继续执行case4 case 4: m++;//m = 5 break;//跳出【外部的switch语句】 default: break; } printf("m = %d, n = %d\n", m, n);//m = 5, n = 3 return 0; }
break
跳出的只是自己所在的switch语句!
总结
本文详细介绍了分支语句中的switch语句,对分支语句有一个更细致的了解。