0

我只是好奇:使用如下 switch 语句:

switch(myVar)
{
case(label):
    ...
    break;
}

为什么标签必须是常量?

4

4 回答 4

4

Andy Prowl 提供了标准中的相关段落,这可能是您想要这样的原因。

考虑switch (c) { case a: ...; break; case b: ...; break; }a==b如果和 ,你期望会发生b==c什么?

如果你用if ...; if ...or来写这个if ...; else if ...,语义就很清楚了。在的情况下switch,没有那么多。当然,您可以将其定义为以一种或另一种方式运行,但恕我直言,这会导致代码的行为无法立即清楚,这通常是一件坏事。

于 2013-03-22T14:26:30.847 回答
2

如果标签不是恒定的,它可能会导致歧义,

int a = 1, b = 6;

switch(myVar)
{

case a+1;
//etc
break;

case 2;
//etc
break;

}
于 2013-03-22T14:26:35.060 回答
2

C 中的a 背后的整个想法switch是编译器可以“准备”什么myVar值去哪里。是的,它仍然可以选择使用 if-else-if-else 类型的操作链,但是给定一个特定的 值myVar,每次的结果应该是相同的。当然,如果表达式 inlabel不是常量,则它无法确定每个值在编译时的去向。

如果这不是您想要的,那么您需要在您的代码中执行其他操作 - 表或大量 if 语句将是最明显的解决方案。

于 2013-03-22T14:31:36.273 回答
1

可以使用任何常量表达式。根据 C++11 标准的第 6.4.2 段:

条件应为整数类型、枚举类型或类类型。如果是类类型,则条件在上下文中隐式转换(第 4 条)为整数或枚举类型。进行整体促销。switch 语句中的任何语句都可以用一个或多个 case 标签标记,如下所示:

案例常量表达式

其中常量表达式应是转换条件的提升类型的转换常量表达式(5.19)。同一个 switch 中的任何两个 case 常量在转换为 switch 条件的提升类型后都不应具有相同的值。

于 2013-03-22T14:23:25.357 回答