为什么切换只能比较const值?

时间:2013-03-22 14:20:57

标签: c++ switch-statement

我只是好奇:采取像:

这样的开关语句
switch(myVar)
{
case(label):
    ...
    break;
}

为什么标签必须是const?

4 个答案:

答案 0 :(得分:4)

Andy Prowl提供了标准中的相关段落,这可能是为什么你想要它的原因。

考虑switch (c) { case a: ...; break; case b: ...; break; }。如果a==bb==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)   切换条件。转换后,同一开关中的两个外壳常数不应具有相同的值   推荐的切换条件类型。