我只是好奇:使用如下 switch 语句:
switch(myVar)
{
case(label):
...
break;
}
为什么标签必须是常量?
Andy Prowl 提供了标准中的相关段落,这可能是您想要这样的原因。
考虑switch (c) { case a: ...; break; case b: ...; break; }
。a==b
如果和 ,你期望会发生b==c
什么?
如果你用if ...; if ...
or来写这个if ...; else if ...
,语义就很清楚了。在的情况下switch
,没有那么多。当然,您可以将其定义为以一种或另一种方式运行,但恕我直言,这会导致代码的行为无法立即清楚,这通常是一件坏事。
如果标签不是恒定的,它可能会导致歧义,
int a = 1, b = 6;
switch(myVar)
{
case a+1;
//etc
break;
case 2;
//etc
break;
}
C 中的a 背后的整个想法switch
是编译器可以“准备”什么myVar
值去哪里。是的,它仍然可以选择使用 if-else-if-else 类型的操作链,但是给定一个特定的 值myVar
,每次的结果应该是相同的。当然,如果表达式 inlabel
不是常量,则它无法确定每个值在编译时的去向。
如果这不是您想要的,那么您需要在您的代码中执行其他操作 - 表或大量 if 语句将是最明显的解决方案。
可以使用任何常量表达式。根据 C++11 标准的第 6.4.2 段:
条件应为整数类型、枚举类型或类类型。如果是类类型,则条件在上下文中隐式转换(第 4 条)为整数或枚举类型。进行整体促销。switch 语句中的任何语句都可以用一个或多个 case 标签标记,如下所示:
案例常量表达式:
其中常量表达式应是转换条件的提升类型的转换常量表达式(5.19)。同一个 switch 中的任何两个 case 常量在转换为 switch 条件的提升类型后都不应具有相同的值。