在 C++ 中,switch 语句的 case 标签必须是常量表达式(constant expression),这意味着它们的值必须在编译时确定。因此,switch 语句的 case 标签通常使用常量值(如整数、字符或枚举值),而不能是变量或运行时计算的值。
具体规则:
-
switch的条件表达式:switch的条件表达式可以是变量或表达式,但其结果必须是整数类型(如int、char、enum等)。
- 例如:
```int x = 2;
switch (x) { // x 是变量,但它的值在运行时确定
case 1:
// ...
break;
case 2:
// ...
break;
default:
// ...
}
-
case标签的值:case标签的值必须是常量表达式,即在编译时可以确定的值。
- 例如:
const int y = 10;
switch (x) {
case y: // y 是常量,可以在编译时确定
// ...
break;
case 20: // 20 是字面量常量
// ...
break;
default:
// ...
}
- 注意上面 1 和 2 的区别
-
不允许使用非常量值:
- 如果
case标签的值是变量或运行时计算的值,编译器会报错。
- 如果
- 例如:
int z = 30;
switch (x) {
case z: // 错误:z 是非常量
// ...
break;
default:
// ...
}
-
枚举值:
- 枚举值是常量,因此可以用作
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。