cpp - 为什么不能在 switch 语句中使用 boolean、float 和 string

cpp - why you can't use boolean, float, & string in switch Statements

我是 C++ 的新手,目前正在学习 switch 语句,但我不知道为什么当我使用布尔值、浮点数和字符串时我的编译器会抛出错误或警告(如果是布尔值)?

我该如何解决这个问题?或者为什么会发生

在过去,有时在今天,switch 语句被翻译成分支或跳转语句的数组,最好是连续的。

与数组一样,索引 8.9、“frog”和“false”没有意义。

C 和 C++ 语言是为提高编译效率而设计的。一组跳转指令比必须执行“if-else-if”梯形图更有效,后者是其他索引类型(例如浮点数和文本或字符串)所必需的。

对于那些迂腐的读者:
使用整数作为案例值可以更好地优化(实施)决策结构。连续的(连续的)案例值允许更好的优化或实施。最佳决策结构是一组跳转、分支指令或函数指针。

例如,最佳实施方式为:
destination_address = switch_table[case_value]; 许多处理器可以用一条指令实现这一点。

其他语言可能会实现 的 table。浮点大小写值的一个问题是比较与浮点是否相等很困难,因为并非所有数字都可以用浮点精确表示。例如,如果您有 case 3.14: 并且您的索引是 3.14159,那么情况是否已激活?

对于字符串或文本大小写值,必须比较足够的字符以确定是否相等。比如“双曲线”和“超线程”需要经过5次迭代才能确定是否相等。可以使用散列,但使用散列函数执行的次数可能比要比较的字母多。

因此,为了紧凑高效地实现 switch 语句,C 和 C++ 语言的作者决定将 case 值限制为整数。其他形式,如字符串,将需要 if-else-if 阶梯、table 搜索或字典(地图)。

首先,您可以在 switch 语句中使用布尔值:

int main(int argc, char** argv) {
    bool b = argc > 1;
    switch (b) {
    case true:
        break;
    case false:
        break;
    }
}

如上所述,float 不适合进行相等性测试。

既然你问“我怎样才能解决这个问题?”,对于字符串我建议使用无序映射:

std::unordered_map<std::string, int> m = { {"abc", 1}, {"qwe", 2} };
switch(m["foo"]) {
case m["abc"]:
...
}