C++ switch 语句

在 C++ 中,switch 语句是一种条件控制结构,用于根据表达式的值选择执行不同的代码块。它是 if-else 语句的替代方案,适合处理多个固定值的分支逻辑。以下是对 C++ switch 语句的详细介绍,包括语法、用法、示例和注意事项,适合初学者快速上手。


1. 定义

  • switch 语句根据一个表达式的值(通常是整数或枚举类型)匹配对应的 case 标签,执行相关代码块。
  • 特点
  • 提高代码可读性,适合处理多个离散值。
  • 比多个 if-else 语句更简洁。
  • 支持 break 控制分支退出,防止“贯穿”(fall-through)。

2. 语法

switch (expression) {
    case value1:
        // 代码块
        break;
    case value2:
        // 代码块
        break;
    ...
    default:
        // 默认代码块(可选)
}
  • 组成部分
  • expression:要评估的表达式,通常是整数、字符或枚举类型(C++17 后支持更多类型)。
  • case value:与 expression 比较的常量值,必须是编译时常量。
  • break:退出 switch 语句,防止执行后续 case
  • default:当没有匹配的 case 时执行(可选)。

3. 基本用法

3.1 简单 switch 示例

#include <iostream>
using namespace std;

int main() {
    int day = 3;

    switch (day) {
        case 1:
            cout << "Monday" << endl;
            break;
        case 2:
            cout << "Tuesday" << endl;
            break;
        case 3:
            cout << "Wednesday" << endl;
            break;
        case 4:
            cout << "Thursday" << endl;
            break;
        case 5:
            cout << "Friday" << endl;
            break;
        default:
            cout << "Weekend" << endl;
    }

    return 0;
}

输出

Wednesday
  • 说明
  • day 的值(3)匹配 case 3,执行对应的代码块。
  • break 确保执行完后退出 switch

3.2 使用 default

#include <iostream>
using namespace std;

int main() {
    char grade = 'B';

    switch (grade) {
        case 'A':
            cout << "Excellent!" << endl;
            break;
        case 'B':
            cout << "Good!" << endl;
            break;
        case 'C':
            cout << "Average" << endl;
            break;
        default:
            cout << "Invalid grade" << endl;
    }

    return 0;
}

输出

Good!

4. 贯穿(Fall-through)

  • 如果 case 块中没有 break,程序会继续执行后续的 case 代码,直到遇到 breakswitch 结束。
  • 示例
#include <iostream>
using namespace std;

int main() {
    int number = 2;

    switch (number) {
        case 1:
            cout << "One ";
        case 2:
            cout << "Two ";
        case 3:
            cout << "Three ";
        default:
            cout << "Default" << endl;
    }

    return 0;
}

输出

Two Three Default
  • 说明number = 2 匹配 case 2,但没有 break,所以继续执行 case 3default

5. 高级用法

5.1 使用枚举

#include <iostream>
using namespace std;

enum Color { RED, GREEN, BLUE };

int main() {
    Color color = GREEN;

    switch (color) {
        case RED:
            cout << "Red" << endl;
            break;
        case GREEN:
            cout << "Green" << endl;
            break;
        case BLUE:
            cout << "Blue" << endl;
            break;
    }

    return 0;
}

输出

Green
  • 说明:枚举类型常用于 switch,提高代码可读性。

5.2 嵌套 switch

#include <iostream>
using namespace std;

int main() {
    int x = 1, y = 2;

    switch (x) {
        case 1:
            switch (y) {
                case 2:
                    cout << "x=1, y=2" << endl;
                    break;
                default:
                    cout << "x=1, unknown y" << endl;
            }
            break;
        default:
            cout << "Unknown x" << endl;
    }

    return 0;
}

输出

x=1, y=2

6. C++17 特性:初始化语句

C++17 引入了 switch 语句中的初始化语句,允许在 switch 中定义变量:

#include <iostream>
using namespace std;

int main() {
    int value = 5;

    switch (int x = value + 1; x) { // C++17 初始化
        case 6:
            cout << "Value is 5" << endl;
            break;
        default:
            cout << "Other value" << endl;
    }

    return 0;
}

输出

Value is 5

7. 注意事项

  • 表达式类型
  • switch 的表达式必须是整型、字符型、枚举型或可转换为整型的类型(C++11 后支持更多类型)。
  • 浮点数(如 floatdouble)或字符串(如 std::string)不能直接用于 switch
  • case 值
  • case 后的值必须是编译时常量(常量表达式)。
  • 不能重复,否则编译错误。
  • break 的重要性
  • 忘记 break 会导致贯穿,可能引发逻辑错误。
  • 故意省略 break 可用于某些场景(如多值共享同一逻辑)。
  • default
  • 建议包含 default 处理未预期的值。
  • 可为空(default: break;)。
  • 性能
  • switch 通常比多个 if-else 更快(编译器可能优化为跳转表)。
  • 适用于离散值,不适合范围判断(使用 if-else 更合适)。
  • 作用域
  • case 块中定义的变量作用域仅限于当前块,建议用 {} 显式限定:
    cpp case 1: { int x = 10; // 限定作用域 cout << x << endl; break; }

8. 常见使用场景

  • 菜单选择:根据用户输入执行不同操作。
  • 状态机:处理有限状态机的状态转换。
  • 枚举处理:与枚举类型结合,处理固定选项。
  • 错误码处理:根据错误码执行不同逻辑。

9. 实际示例

9.1 简单计算器

#include <iostream>
using namespace std;

int main() {
    char op;
    double num1, num2;

    cout << "Enter operator (+, -, *, /): ";
    cin >> op;
    cout << "Enter two numbers: ";
    cin >> num1 >> num2;

    switch (op) {
        case '+':
            cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
            break;
        case '-':
            cout << num1 << " - " << num2 << " = " << num1 - num2 << endl;
            break;
        case '*':
            cout << num1 << " * " << num2 << " = " << num1 * num2 << endl;
            break;
        case '/':
            if (num2 != 0)
                cout << num1 << " / " << num2 << " = " << num1 / num2 << endl;
            else
                cout << "Error: Division by zero!" << endl;
            break;
        default:
            cout << "Invalid operator" << endl;
    }

    return 0;
}

输入

Enter operator (+, -, *, /): +
Enter two numbers: 5 3

输出

5 + 3 = 8

10. 总结

  • switch:适合处理多个离散值的分支逻辑,语法简洁,性能较高。
  • 核心点
  • 使用 casebreak 控制分支。
  • default 处理未匹配情况。
  • 支持整型、字符、枚举等类型。
  • 推荐实践
  • 始终包含 break(除非需要贯穿)。
  • 使用 default 提高健壮性。
  • 复杂逻辑或范围判断使用 if-else
  • if-else 的选择
  • switch:离散值、固定选项。
  • if-else:范围判断、复杂条件。

如果你需要更详细的示例(如复杂状态机、C++17 特性应用)或对其他 C++ 特性的说明,请告诉我!

类似文章

发表回复

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