多重选择结构-switch语句

一、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 语句的执行顺序

  1. 首先计算 switch 后面括号内表达式的值。
  2. 然后在各个 case 分支中寻找与该值相等的常量表达式。
  3. 如果找到匹配的 case,则以此为入口,从该 case 后的语句开始顺序向下执行。
  4. 如果没有找到匹配的 case,且有 default 分支,则从 default 处开始执行;如果没有 default,则整个 switch 语句不执行任何操作。

四、break 语句的作用

switch 语句的一个关键特性:一旦从匹配的 case 进入,程序会一直向下顺序执行,直到遇到 break 语句或到达 switch 的结束大括号。

如果省略 break,会发生”贯穿”(fallthrough),即执行完当前 case 的语句后,继续执行下一个 case 的语句,而不检查该 case 的常量是否匹配。

因此,在大多数情况下,每个 case 末尾都应添加 break 语句来终止当前分支。

五、使用 switch 语句的注意事项

  1. case 后面的常量表达式值必须互不相同,否则会产生二义性。
  2. case 和 default 的出现次序不影响执行结果,但通常将 default 放在最后。
  3. 多个 case 可以共用同一组语句,写法为连续写 case 标签后跟一条语句。
  4. switch 表达式的类型限制为整型、字符型或枚举型,不能是浮点型或字符串。
  5. 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 的比较

特性switchif-else-if
判断条件同一表达式的多个离散值任意条件表达式
表达式类型整型、字符型、枚举型任意类型
条件形式只能是常量值的精确匹配支持范围判断、逻辑组合
执行效率多分支时效率较高(跳转表)条件按顺序逐一判断
可读性分支多且为离散值时更清晰条件复杂时更灵活

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注