为什么C++ switch语句仅限于常量表达式?

Jan*_*ana 3 c++ switch-statement

在我意识到语句需要是常量之前,我想在switch语句中使用宏函数.示例(不编译):

#define BAND_FIELD1(B)   (10 * B + 1)
...
#define BAND_FIELD7(B)   (10 * B + 7)

int B = myField % 10;
switch (myField) {
    case BAND_FIELD1(B):
        variable1[B] = 123;
        break;
    case BAND_FIELD7(B):
        variable7[B] = 321;
        break;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我宁愿使用if .. else:

if (myField == BAND_FIELD1(B)
    variable1[B] = 123;
else if (myField == BAND_FIELD7(B)
    variable7[B] = 321;
Run Code Online (Sandbox Code Playgroud)

为什么C++ switch语句仅限于常量表达式?

Sti*_*sis 6

当提供常量(例如跳转表或二叉搜索树)时,编译器可以为开关生成尽可能最快的代码。

当给定非常量值时,它无法生成比链式语句更快的if代码else。无论如何,你已经可以使用它了!


Ker*_* SB 5

C++的优势之一是它的静态检查.该switch陈述是一种静态控制流构造,其功能在于能够(静态地)检查是否已经考虑了所有案例,并且能够合理地分组案例(例如,通过公共部分进行分组).

如果要动态检查条件,可以使用各种技术(if语句,条件运算符,关联数组,虚函数等)来实现.


Sho*_*hoe 5

为什么c ++ switch语句仅限于常量表达式?

因为switch语句执行的检查是静态的.这意味着需要在编译时知道表达式.

在C++ 11中,您可以使用constexpr(如果表达式由其他常量表达式派生),对您有利.例如,考虑这个函数(替换你的#define):

inline constexpr int BAND_FIELD1(int B) {
    return 10 * B + 1;
}
Run Code Online (Sandbox Code Playgroud)

用于以下代码的简化版本:

constexpr int myField = 0;
constexpr int B = myField % 10;

int variable1 = 0;
switch (myField) {
    case BAND_FIELD1(B):
        variable1 = 123;
        break;
    // ...
    default: break;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,上面的代码很容易编译.