一、switch 语句的概念
在有的问题中,虽然需要进行多次判断选择,但是每次都是判断同一个表达式的值。这样就没必要在每一个嵌套的 if 语句中都计算一遍表达式的值。为此,C++ 提供了 switch 语句,专门用来解决这类问题。
switch 语句将表达式的值与多个常量进行匹配,从而实现多分支选择。
二、switch 语句的语法形式
switch (表达式)
{
case 常量表达式1: 语句1
case 常量表达式2: 语句2
...
case 常量表达式n: 语句n
default: 语句n+1
}Code language: PHP (php)
说明:
- 表达式的类型必须是整型、字符型或枚举型(即整数类型)。
- case 后面的常量表达式必须是编译期可确定的整型常量,不能包含变量。
- default 分支是可选的,当所有 case 都不匹配时执行。
三、switch 语句的执行顺序
- 首先计算 switch 后面括号内表达式的值。
- 然后在各个 case 分支中寻找与该值相等的常量表达式。
- 如果找到匹配的 case,则以此为入口,从该 case 后的语句开始顺序向下执行。
- 如果没有找到匹配的 case,且有 default 分支,则从 default 处开始执行;如果没有 default,则整个 switch 语句不执行任何操作。
四、break 语句的作用
switch 语句的一个关键特性:一旦从匹配的 case 进入,程序会一直向下顺序执行,直到遇到 break 语句或到达 switch 的结束大括号。
如果省略 break,会发生”贯穿”(fallthrough),即执行完当前 case 的语句后,继续执行下一个 case 的语句,而不检查该 case 的常量是否匹配。
因此,在大多数情况下,每个 case 末尾都应添加 break 语句来终止当前分支。
五、使用 switch 语句的注意事项
- case 后面的常量表达式值必须互不相同,否则会产生二义性。
- case 和 default 的出现次序不影响执行结果,但通常将 default 放在最后。
- 多个 case 可以共用同一组语句,写法为连续写 case 标签后跟一条语句。
- switch 表达式的类型限制为整型、字符型或枚举型,不能是浮点型或字符串。
- case 后面的常量表达式不能是变量或范围条件(如 case x > 5: 是非法的)。
六、代码示例
以下代码演示了 switch 语句的实际应用:
#include <iostream>
using namespace std;
int main()
{
// 示例1:输入0~6的整数,转换成星期输出
cout << "请输入0~6\n";
int n;
cin >> n;
switch (n)
{
case 0: cout << "星期天\n"; break;
case 1: cout << "星期一\n"; break;
case 2: cout << "星期二\n"; break;
case 3: cout << "星期三\n"; break;
case 4: cout << "星期四\n"; break;
case 5: cout << "星期五\n"; break;
case 6: cout << "星期六\n"; break;
default: cout << "输入不符合\n"; break;
}
// 示例2:多个case共用同一组语句
int grade;
cout << "Enter a grade (A-F): ";
cin >> grade;
switch (grade)
{
case 'A':
case 'a':
cout << "Excellent" << endl;
break;
case 'B':
case 'b':
cout << "Good" << endl;
break;
case 'C':
case 'c':
cout << "Pass" << endl;
break;
case 'D':
case 'd':
case 'F':
case 'f':
cout << "Needs Improvement" << endl;
break;
default:
cout << "Invalid grade" << endl;
break;
}
// 示例3:省略break的贯穿效果(不推荐,仅演示)
int month = 2;
int days;
switch (month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31;
break;
case 4: case 6: case 9: case 11:
days = 30;
break;
case 2:
days = 28;
break;
default:
days = 0;
break;
}
cout << "Month " << month << " has " << days << " days" << endl;
// 示例4:字符判断
char ch;
cout << "Enter a character: ";
cin >> ch;
switch (ch)
{
case 'y':
case 'Y':
cout << "Yes" << endl;
break;
case 'n':
case 'N':
cout << "No" << endl;
break;
default:
cout << "Unknown" << endl;
break;
}
return 0;
}Code language: PHP (php)
七、switch 与 if-else-if 的比较
| 特性 | switch | if-else-if |
|---|---|---|
| 判断条件 | 同一表达式的多个离散值 | 任意条件表达式 |
| 表达式类型 | 整型、字符型、枚举型 | 任意类型 |
| 条件形式 | 只能是常量值的精确匹配 | 支持范围判断、逻辑组合 |
| 执行效率 | 多分支时效率较高(跳转表) | 条件按顺序逐一判断 |
| 可读性 | 分支多且为离散值时更清晰 | 条件复杂时更灵活 |
Previous: 多重选择结构-if-else-if
Next: 循环结构-while语句