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"]:
...
}
我是 C++ 的新手,目前正在学习 switch 语句,但我不知道为什么当我使用布尔值、浮点数和字符串时我的编译器会抛出错误或警告(如果是布尔值)?
我该如何解决这个问题?或者为什么会发生
在过去,有时在今天,switch
语句被翻译成分支或跳转语句的数组,最好是连续的。
与数组一样,索引 8.9、“frog”和“false”没有意义。
C 和 C++ 语言是为提高编译效率而设计的。一组跳转指令比必须执行“if-else-if”梯形图更有效,后者是其他索引类型(例如浮点数和文本或字符串)所必需的。
对于那些迂腐的读者:
使用整数作为案例值可以更好地优化(实施)决策结构。连续的(连续的)案例值允许更好的优化或实施。最佳决策结构是一组跳转、分支指令或函数指针。
例如,最佳实施方式为:
destination_address = switch_table[case_value];
许多处理器可以用一条指令实现这一点。
其他语言可能会实现 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"]:
...
}