C++ 为什么开关只能与常量值进行比较?

C++ 为什么开关只能与常量值进行比较?,c++,switch-statement,C++,Switch Statement,我只是好奇:用一个switch语句,比如: switch(myVar) { case(label): ... break; } 为什么标签必须是常量?可以使用任何常量表达式。根据C++11标准第6.4.2段: 条件应为整型、枚举型或类型。如果是类类型,则条件在上下文中隐式转换为整型或枚举类型。执行整体促销。switch语句中的任何语句都可以使用一个或多个case标签进行标记,如下所示: 大小写常量表达式: 其中,常量表达式应为升级类型的转换常量表达式5.19 切换条件。转换后,

我只是好奇:用一个switch语句,比如:

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

为什么标签必须是常量?

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

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

大小写常量表达式:

其中,常量表达式应为升级类型的转换常量表达式5.19 切换条件。转换后,同一开关中的两个外壳常数不得具有相同的值 切换到开关条件的升级类型


Andy Prowl提供了标准中的相关段落,以下是您希望这样做的可能原因

考虑开关c{caseA:…;break;caseB:…;break;}。如果a==b和b==c,您希望发生什么

如果你用If。。。;如果或者如果。。。;否则,如果…,语义是明确的。在开关的情况下,没有那么多。当然,您可以将其定义为一种方式或另一种方式,但我认为这会导致代码的行为不立即清晰,这通常是一件坏事。

如果标签不是常量,可能会导致歧义

int a = 1, b = 6;

switch(myVar)
{

case a+1;
//etc
break;

case 2;
//etc
break;

}
C中开关背后的全部思想是编译器可以准备myVar值的去向。是的,它仍然可以选择使用if-else-if-else类型的操作链,但是给定一个特定的myVar值,每次的结果都应该是相同的。当然,如果label中的表达式不是常量,则它无法确定每个值在编译时的位置


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

我很确定这不是常量值,而是枚举、整数或字符串。为什么标签必须是常量?因为这就是语言的工作原理。但是你没有因为这个问题而给我打分吗?难道没有一个原因可以解释为什么语言是这样工作的吗?可能是OK的复制品,这真的很有意义。非常感谢。