2.6.2 switch结构
switch结构又称开关结构,其基本形式如下所示。
switch(开关表达式) { case常量1: 语句序列1; case常量2: 语句序列2; …… case常量N: 语句序列N; default: 语句序列N+1; }
开关表达式必须是结果为整数值的表达式,case后的常量也必须是整型、char型或枚举常量中的一种。当程序执行到switch结构时,首先对开关表达式进行计算,并从上到下在所有case常量中寻找与表达式的值匹配者,匹配的那条case语句即是switch结构的入口,如果所有的case语句都不匹配,则以default为入口,当没有default且所有的case常量都不匹配时,程序不进入该switch结构。
注意
虽然default部分可以省略,但不推荐这种用法,大部分编译器也会给出相应的警告,即使不进行任何default操作,最好也用如下的形式注明。
default: ;//(空语句。不要忘记分号)
举例而言,一个班级有5个人分别为A、B、C、D和E,对应的学号分别是1、2、3、4和5,现设计程序,由用户输入学号,程序给出对应姓名,见代码2.24。
代码2.24 switch结构用法SwitchSample1
<—————————————文件名:example224.cpp—————————————-> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 int x;//声明一个int型变量x,用来表示学号 06 cout<<"请输入学号(1~5):"<<endl; 07 cin>>x;//接收用户输入 08 switch(x)//开关结构 09 { 10 case 1: 11 cout<<"姓名:A"<<endl; 12 case 2: 13 cout<<"姓名:B"<<endl; 14 case 3: 15 cout<<"姓名:C"<<endl; 16 case 4: 17 cout<<"姓名:D"<<endl; 18 case 5: 19 cout<<"姓名:E"<<endl; 20 default: 21 cout<<"请检查输入是否正确"; 22 } 23 return 0; 24 }
【代码解析】代码第8行,使用了switch语句来判断用户输入的数据应该输出什么内容到屏幕。
输出结果如下所示。
请输入学号: 2(注:键盘输入) 姓名:B 姓名:C 姓名:D 姓名:E 请检查输入是否正确
代码2.24 并没有获得正确的结果,本来只打算输出“姓名:B”,却将“case 2:”后的语句都执行了一遍,原因在于switch结构中一个个的case只是行标签,不是选项之间的界限,程序运行到switch结构入口处的case语句时,将依次执行之后的所有语句,不会在到达下一个case处停止,一直到switch结构的闭花括号才会停止。
为使流程提前转出switch结构,可使用break语句,见代码2.25。
代码2.25 break在switch中的应用BreakInSwitch
<—————————————-文件名:example225.cpp—————————————-> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 int x; 06 cout<<"请输入学号:"<<endl; 07 cin>>x; 08 switch(x) 09 { 10 case 1: 11 cout<<"姓名:A"<<endl; 12 break;//break语句跳出当前switch结构,后面的语句不再执行 13 case 2: 14 cout<<"姓名:B"<<endl; 15 break; 16 case 3: 17 cout<<"姓名:C"<<endl; 18 break; 19 case 4: 20 cout<<"姓名:D"<<endl; 21 break; 22 case 5: 23 cout<<"姓名:E"<<endl; 24 break; 25 default: 26 cout<<"请检查输入是否正确"<<endl; 27 } 28 return 0; 29 }
【代码解析】代码第12行,使用了break语句跳出当前switch结构,其后面的语句都不再执行。
输出结果如下所示。
请输入学号: 2(注:键盘输入) 姓名:B
使用break的目的是跳出当前switch结构,不再执行后面的语句,break是流程转向语句,关于流程转向语句的介绍,请参考本章稍后的内容。
从上面的描述中,我们可以知道,case标签只起到入口的作用,为了程序的精练,经常采用多个入口共用一个语句的写法,见代码2.26。
代码2.26 多个case标签共用一个语句SwitchSample2
<—————————————-文件名:example226.cpp—————————————-> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 int x; 06 cout<<"请输入学号:"<<endl; 07 cin>>x; 08 switch(x) 09 { 10 case 1:case 3:case 5://case起到的是入口作用 11 cout<<"及格"<<endl;//多个入口执行的代码相同 12 break;//break语句跳出 13 case 2:case 4: 14 cout<<"不及格"<<endl; 15 break; 16 default: 17 cout<<"请检查输入是否正确"<<endl; 18 } 19 return 0; 20 }
【代码解析】代码第10行,即多个case入口都使用一个执行语句。
代码2.26 简单模拟了一个成绩查询系统,当输入的学号为1、3或5时,输出“及格”,当输入的学号为2或4时,输出“不及格”,否则,提醒用户检查输入是否正确。多个case标签共用一个语句,使代码在形式上和逻辑上都十分精练。
关于switch结构还有以下几点要特别注意。
(1)最先匹配的case才是switch结构的入口,因此,switch结构中匹配case前的语句是永远不被执行的。
(2)在同一个switch结构中,不能有相同的case常量。
(3)case常量和表达式值必须是整型、char型和枚举型中的一种,原则上要求两者类型一致,但大多数编译器允许类型不一致的情况发生,此时需比较两者数值是否相等。
(4)switch结构同样支持嵌套。