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