switch 小知识 -- 常量

104 阅读1分钟

在 C++ 中,switch 语句的 case 标签必须是常量表达式(constant expression),这意味着它们的值必须在编译时确定。因此,switch 语句的 case 标签通常使用常量值(如整数、字符或枚举值),而不能是变量或运行时计算的值。

具体规则:

  1. switch 的条件表达式

    • switch 的条件表达式可以是变量或表达式,但其结果必须是整数类型(如 intcharenum 等)。
  • 例如:
```int x = 2;
switch (x) {  // x 是变量,但它的值在运行时确定
    case 1:
        // ...
        break;
    case 2:
        // ...
        break;
    default:
        // ...
}
  1. case 标签的值

    • case 标签的值必须是常量表达式,即在编译时可以确定的值。
  • 例如:
const int y = 10;
switch (x) {
    case y:  // y 是常量,可以在编译时确定
        // ...
        break;
    case 20: // 20 是字面量常量
        // ...
        break;
    default:
        // ...
}
  • 注意上面 1 和 2 的区别
  1. 不允许使用非常量值

    • 如果 case 标签的值是变量或运行时计算的值,编译器会报错。
  • 例如:
int z = 30;
switch (x) {
    case z:  // 错误:z 是非常量
        // ...
        break;
    default:
        // ...
}
  1. 枚举值

    • 枚举值是常量,因此可以用作 case 标签。
  • 例如:
enum Color { RED, GREEN, BLUE };
Color c = RED;
switch (c) {
    case RED:   // RED 是枚举常量
        // ...
        break;
    case GREEN:
        // ...
        break;
    default:
        // ...
}

总结:

  • switch 语句的 case 标签值必须是常量表达式(如字面量、const 变量、枚举值等)。
  • switch 的条件表达式可以是变量或表达式,但其结果必须是整数类型。
  • 如果 case 标签的值是变量或运行时计算的值,编译器会报错。

如果你需要在 case 标签中使用动态值,可以考虑使用 if-else 语句来代替 switch