假设要创建一个屏幕菜单,要求用户从5个选项中选择一个,例如,便宜、适中、昂贵、奢侈、过度。虽然可以扩展if else if else序列来处理这5种情况,但是C++的switch语句能够更容易地从大型列表中进行选择。
下面是switch语句的通用格式:
switch(integer-expression)
{
case label1 : statement(s)
case label2 : statement(s)
...
default : statement(s)
}
C++的switch语句就像指路牌,告诉计算机接下来应执行哪行代码。执行到switch语句时,程序将跳到使用integer-expression的值标记的那一行。例如,如果integer-expression的值为4,则程序将执行标签为case4:那一行。顾名思义,integer-expression必须是一个结果为整数值的表达式。另外,每个标签都必须是整数常量表达式。最常见的标签是int或char常量(如1或‘q’),也可以是枚举量。如果integer-expression不与任何标签匹配,则程序将跳到标签为default的那一行。default标签是可选的,如果被省略,而又没有匹配的标签,则程序将跳到switch后面的语句处执行。(参见图6.3)
C++中的case标签只是行标签,而不是选项之间的界限。也就是说,程序跳到switch中特定代码行后,将依次执行之后的所有语句,除非有明确的其他指示。程序不会在执行到下一个case处自动停止,要让程序执行完一组特定语句后停止,必须使用break语句。这将导致程序在跳到switch后面的语句处执行。
程序清单6.10演示了如何使用switch和break来让用户选择简单菜单。该程序使用showmenu()函数显示一组选项,然后使用switch语句,根据用户的反应来执行相应的操作。
//6.10
#if 1
#include<iostream>
using namespace std;
void showmenu();//函数原型
void report();
void comfort();
int main()
{
showmenu();//函数调用
int choice;
cin >> choice;
while (choice != 5)
{
switch (choice)
{
case 1:cout << "\a\n";
break;//break语句确保只执行switch语句中的特定部分。
case 2:report();
break;
case 3:cout << "The boss was in all day.\n";
break;
case 4:comfort();
break;
default:cout << "That's not a choice.\n";
}
showmenu();
cin >> choice;
}
cout << "Bye!\n";
system("pause");
return 0;
}
void showmenu()//函数定义
{
cout << "Please enter 1,2,3,4,or 5:\n"
"1)alarm 2)report\n"
"3)alibi 4)comfprt\n"
"5)quit\n";
}
void report()
{
cout << "It's been as excellent week for business.\n"
"Sales are up 120%.Expenses are down 35%.\n";
}
void comfort()
{
cout << "Your employees think you are the finest CEO\n"
"in the industry.The board of directors think\n"
"you are the finest CEO in the industry.\n";
}
#endif
1.将枚举量作为用作标签
程序清单6.11使用enum定义了一组相关的常量,然后在switch语句中使用这些常量。通常,cin无法识别枚举类型(它不知道程序员是如何定义它们的),因此该程序要求用户选择选项时输入一个整数。当switch语句将int值和枚举标签进行比较时,将枚举量提升为int。另外,在while循环测试条件时,也会将枚举量提升为int类型。
//6.11
#if 1
#include<iostream>
using namespace std;
enum{red,orange,yellow,green,blue,violet,indigo};//枚举
int main()
{
cout << "Enter color code(0-6): ";
int code;
cin >> code;
while (code >= red && code <= indigo)
{
switch (code)
{
case red:cout << "Her lips were red.\n"; break;
case orange:cout << "Her hair was orange.\n"; break;
case yellow:cout << "Her shoes were yellow.\n"; break;
case green:cout << "Her nails were green.\n"; break;
case blue:cout << "Her sweatsuit was blue.\n"; break;
case violet:cout << "Her eyes were violet.\n"; break;
case indigo:cout << "Her mood was indigo.\n"; break;
}
cout << "Enter color code(0-6): ";
cin >> code;
}
cout << "Bye\n";
system("pause");
return 0;
}
#endif
2.switch和if else
switch语句和if else语句都允许程序从选项中进行选择。相比之下,if else更通用。例如,它可以处理取值范围。
如果所有的选项都可以使用整数常量来标识,则可以使用switch语句或if else语句。由于switch语句是专门为这种情况设计的,因此,如果选项超过两个,则就代码长度和执行速度而言,switch语句的效率更高。
如果既可以使用if else语句,也可以使用switch语句,则当选项不少于3个时,应使用switch语句。