7.2.3 多分支结构语句
C程序经常会选择执行多个分支,多分支选择结构共有n个操作,实际上前面介绍的嵌套双分支语句可以实现多分支结构。C语言还专门提供了一种实现多分支结构的switch语句。
switch语句的格式如下所示。
switch(表达式){ case常量表达式1: 语句1; case常量表达式2: 语句2; … case常量表达式n: 语句n; default : 语句n+1; }
上述格式的含义是:计算表达式的值,并与其后的常量表达式逐个进行比较,当表达式的值与某个常量表达式的值相等时,执行其后的语句,然后不再进行判断,继续执行case后的所有语句。如果表达式的值与所有case后的常量表达式值均不相同,则执行default后的语句。看下面的一段代码。
int main(void){ int a; printf("输入数字: "); scanf("%d", &a); switch (a){ 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("error\n"); } }
上述代码要求输入一个数字,然后输出一个英文单词。但是当输入3之后,却执行了case 3以及以后的所有语句,输出了Wednesday及以后的所有单词,这显然是不希望的。为什么会出现这种情况呢?这反映了switch语句的一个特点。在switch语句中,“case常量表达式”相当于一个语句标号,若表达式的值和某标号相等则转向该标号处执行,但它不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有case后面语句的情况。这与前面介绍的if语句是完全不同的,应特别注意。为了避免上述情况,C语言提供了break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。在后面还将详细介绍它。修改上面的程序,在每一个case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。看下面的代码。
int main(void){ int a; printf("input integer number: "); scanf("%d", &a); switch (a){ case 1:printf("Monday\n"); break; case 2:printf("Tuesday\n"); break; case 3:printf("Wednesday\n"); break; case 4:printf("Thursday\n"); break; case 5:printf("Friday\n"); break; case 6:printf("Saturday\n"); break; case 7:printf("Sunday\n"); break; default:printf("error\n"); } }
实例7-4
提示用户输入数字,然后输出用户输入的数字
源码路径daima\7\7-4
视频路径 视频\实例\第7章\7-4
本实例的实现文件为“switch.c”,具体实现代码如下。
#include "stdio.h" main() { int i; printf("输入一个数(1-5):"); scanf("%d", &i); switch (i){ case 1:printf("输入的是“1”\n"); break; case 2:printf("输入的是“2”\n"); break; case 3:printf("输入的是“3”\n"); break; case 4:printf("输入的是“4”\n"); break; case 5:printf("输入的是“5”\n"); break; default:printf("输入的数不在范围内\n"); } }
拓展范例及视频二维码
范例7-4-01:演示多条件if语句的用法
源码路径:演练范例\7-4-01\
范例7-4-02:判断整数的正负和奇偶
源码路径:演练范例\7-4-02\
上述代码首先建议用户输入一个1~5的数字,然后根据用户输入的数字利用switch语句来输出对应的提示。
程序运行后将在界面中提示用户输入1个数字,例如输入1个数字3并按Enter键后将在界面中显示刚键入的数字3。执行效果如图7-11所示。
图7-11 执行效果
在具体在使用switch语句时,应该注意如下4点。
(1)case后的各常量表达式的值不能相同,否则会出现错误。
(2)在case后允许有多个语句,可以不用{}括起来。
(3)各个case和default子句的先后顺序可以变动,这不会影响程序执行结果。
(4)default子句可以省略。