C++PrimerPlus 第六章 分支语句和逻辑运算符 - 6.5 switch语句

目录

6.5 switch语句

6.5.1 将枚举量用作标签

6.5.2 switch和if else


6.5 switch语句

假设要创建一个屏幕菜单,要求用户从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,则程序将执行标签为case 4: 那一行。顾名思义,integer-expression必须是一个结果为整数值的表达式。另外,每个标签都必须是整数常量表达式。最常见的标签是int或char常量(如1或 ‘q’),也可以是枚举量。如果integer-expression不与任何标签匹配,则程序将跳到标签为default的那一行。Default标签是可选的,如果被省略,而又没有匹配的标签,则程序将跳到switch后面的语句处执行(参见下图)。

switch语句与Pascal等语言中类似的语句之间存在重大的差别。C++中的case标签只是行标签,而不是选项之间的界限。也是说,程序跳到switch中特定代码行后,将依次执行之后的所有语句,除非有明确的其他指示。程序不会在执行到下一个case处自动停止,要让程序执行完一组特定语句后停止,必须使用break语句。这将导致程序跳到switch后面的语句处执行。

程序清单6.10演示了如何使用switch和break来让用户选择简单菜单。该程序使用showmenu()函数显示一组选项,然后使用switch语句,根据用户的反应执行相应的操作。

注意:

有些硬件/操作系统组合不会将(程序清单6.10的case1中使用的)转义序列\a解释为振铃。

程序清单6.10 switch.cpp

//switch.cpp -- using the switch statement
#include<iostream>
using namespace std;
void showmenu();	//function prototypes
void report();
void comfort();
int main()
{
	showmenu();
	int choice;
	cin >> choice;
	while (choice != 5)
	{
		switch (choice)
		{
		case 1:cout << "\a\n";
			break;
		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";
	return 0;
}

void showmenu()
{
	cout << "Please enter 1, 2, 3, 4, or 5:\n"
		"1) alarm		2) report\n"
		"3) alibi		4) comfort\n"
		"5) quit\n";
}
void report()
{
	cout << "It's been an 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";
}

下面是该程序的运行情况:

        Please enter 1, 2, 3, 4, or 5:

        1) alarm                2) report

        3) alibi                4) comfort

        5) quit

        4

        Your employees think you are the finest CEO

        in the industry. The board of directors think

        you are the finest CEO in the industry.

        Please enter 1, 2, 3, 4, or 5:

        1) alarm                2) report

        3) alibi                4) comfort

        5) quit

        2

        It's been an excellent week for business.

        Sales are up 120%. Expenses are down 35%.

        Please enter 1, 2, 3, 4, or 5:

        1) alarm                2) report

        3) alibi                4) comfort

        5) quit

        6

        That's not a choice.

        Please enter 1, 2, 3, 4, or 5:

        1) alarm                2) report

        3) alibi                4) comfort

        5) quit

        5

        Bye!

当用户输入了5时,while循环结束。输入1到4将执行switch列表中相应的操作,输入6将执行默认语句。

为让这个程序正确运行,输入必须是整数。例如,如果输入一个字母,输入语句将失效,导致循环不断运行,直到您终止程序。为应对不按指示办事的用户,最好使用字符输入。

如前所述,该程序需要break语句来确保只执行switch语句中的特定部分。为检查情况是否如此,可以删除程序清单6.10中的break语句,然后看看其运作情况。例如,读者将发现,输入2后,将执行case标签为2、3、4和default中的所有语句。C++之所以这样,是由于这种行为很有用。例如,它使得使用多个标签很简单。例如,假设重新编写程序清单6.10,使用字符(而不是整数)作为菜单选项和switch标签,则可以为大写标签和小写标签提供相同的语句:

char choice;
cin >> choice;
while (choice != 'Q' && choice != 'q')
{
	switch (choice)
	{
	case 'a':
	case 'A':cout << "\a\n";
		break;
	case 'r':
	case 'R':report();
		break;
	case 'l':
	case 'L':cout << "The boss was in all day.\n";
		break;
	case 'c':
	case 'C': comfort();
		break;
	default:cout << "That's not a choice.\n";
	}
	showmenu();
	cin >> choice;
}

由于case ‘a’后面没有break语句,因此程序将接着执行下一行——case ‘A’后面的语句。

6.5.1 将枚举量用作标签

程序清单6.11使用enum定义了一组相关的常量,然后在switch语句中使用这些常量。通常,cin无法识别枚举类型(它不知道程序员是如何定义它们的),因此该程序要求用户选择选项时输入一个整数。当switch语句将int值和枚举量标签进行比较时,将枚举量提升为int。另外,在while循环测试条件中,也会将枚举量提升为int类型。

程序清单6.11 enum.cpp

//enum.cpp -- using enum
#include<iostream>
//create named constants for 0 - 6
enum { red, orange, yellow, green, blue, violet, indigo };

int main()
{
	using namespace std;
	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";
	return 0;
}

下面是该程序的输出:

        Enter color code (0-6): 3

        Her nails were green.

        Enter color code (0-6): 5

        Her eyes were violet.

        Enter color code (0-6): 2

        Her shoes were yellow.

        Enter color code (0-6): 8

        Bye

6.5.2 switch和if else

switch语句和if else语句都允许程序从选项中进行选择。相比之下,if else更通用。例如,它可以处理取值范围,如下所示:

if (age > 17 && age < 35)
	index = 0;
else if (age >= 35 && age < 50)
	index = 1;
else if (age >= 50 && age < 65)
	index = 2;
else
	index = 3;

然而,switch并不是为处理取值范围而设计的。switch语句中的每一个case标签都必须是一个单独的值。另外,这个值必须是整数(包括char),因此switch无法处理浮点测试。另外,case标签值还必须是常量。如果选项涉及取值范围、浮点测试或两个变量比较,则应使用if else语句。

然而,如果所有的选项都可以使用整数常量来标识,则可以使用switch语句或if else语句。由于switch语句是专门为这种情况设计的,因此,如果选项超过两个,则就代码长度和执行速度而言,switch语句的效率更高。

提示:

如果既可以使用if else if语句,也可以使用switch语句,则当选项不少于3个时,应使用switch语句。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hank_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值