1、switch 结构
c++ 的 switch 语句能够更容易地从大型列表中进行选择。switch 语句的通用格式:
switch (integer-expression)
{
case label11: statement(s)
case label12: statement(s)
...
default: statement(s)
}
c++ 的 switch 语句就像指路牌,告诉计算机接下来应执行哪行代码,执行到 switch 语句时,程序将跳到使用 integer-expression 的值得标记的那一行。例如,如果 integer-expression 的值为 4,则程序执行标签 case 4 那一行。integer-expression 必须是一个结果为整数值得表达式。另外,每个标签都必须是整数常量表达式。最常见的标签是 int 或 char 常量,也可以是枚举量。如果 integer-expression 不匹配任何标签,则程序将跳到标签为 default 的那一行。default 标签可选,如果被忽略,而又没有匹配的标签,则程序将跳到 switch 后面的语句执行。
c++ 中的 case 标签只是行标签,而不是选项之间的界限,也就是说,程序跳到 switch 语句中指定代码后,将依次执行之后的所有语句,除非有明确的其它指示。程序不会在执行到下一个 case 处自动停止,要让程序执行完一组特定语句后停止,必须使用 break 语句。
以下程序演示了如何使用 switch 和break 来让用户选择简单菜单。
#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;
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"
"int the industry. The board of directors think\n"
"you are the finest CEO int the industry.\n";
}
2、switch 的执行逻辑
前面说到,c++ 中的 case 标签只是行标签,程序跳到 switch 语句中指定代码后,将依次执行之后的所有语句。例如,程序跳到 case 2,如果没有 break 语句,则程序将继续执行 3、4、5 语句。这样的设计是为了 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 << ...
...
}
}
程序中,由于 case ‘a’ 后面没有 break 与语句,因此程序将接着执行下一行—case ‘A’ 后面的语句,这样使得一条语句可以对应两个限制条件。
3、将枚举量用作标签
cin 无法识别枚举量,程序要求用户输入一个整数,当switch 语句将 int 值和枚举量标签进行比较时,将枚举量提升为 int。另外,在 while 循环测试条件中,也会将枚举量提升为 int 类型。
#include <iostream>
enum { red, orange, yellow, green, violet, indigo };
int main()
{
using namespace std;
cout << "Enter color code (0-5): ";
int code;
cin >> code;
while (code >= red && code <= indigo)
{
switch (code)
{
case red: cout << "red\n"; break;
case orange: cout << "orange\n"; break;
case yellow: cout << "yellow\n"; break;
case green: cout << "green\n"; break;
case violet: cout << "violet\n"; break;
case indigo: cout << "indigo\n"; break;
}
cout << "Enter color code (0-5): ";
cin >> code;
}
return 0;
}
4、switch 与 if 的区别
switch 的标签只能是整数或 char,则限定了 switch 更加适用于散点值,而 if 可以适用于 5 < x < 9 这样的连续条件。通常情况下,如果可以使用 switch 和 if,当选项不少于 3 个时,使用 switch 效率更高。
5、break 和continue 语句
break 为跳出循环语句,或者跳出 switch 语句,执行循环或者 switch 后面的语句。continue 用于循环中,让程序跳过循环体中余下的代码,并开始新一轮的循环。
**continue 语句:**如下图,程序执行了 statement1 后,进入分支语句 if,如果满足 a < 4 这个条件,则执行 continue 语句,程序不再执行之后的语句,结束本次循环,重新开始下一轮循环;如果不满足 a < 4 这个条件,则继续执行 statement2,直到循环重新开始。
**break 语句:**如下图,程序执行了 statement1 后,进入分支语句 if,如果满足 a < 4 这个条件,则执行 break 语句,程序直接跳出 while 循环,执行 statement3 语句;如果不满足 a < 4 这个条件,则继续执行 statement2,直到循环重新开始。