为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不能将开关语句应用于字符串?

为什么不能将开关语句应用于字符串?

C++
浮云间 2019-07-05 13:24:07
为什么不能将开关语句应用于字符串?编译以下代码并得到type illegal.int main(){     // Compilation error - switch expression of type illegal     switch(std::string("raj"))     {     case"sda":     }}您不能在其中使用字符串。switch或case..为什么?是否有任何解决方案可以很好地支持类似于打开字符串的逻辑?
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

其原因与类型系统有关。C/C+并不真正支持字符串作为一种类型。它确实支持常量char数组的概念,但它并不完全理解字符串的概念。

为了生成开关语句的代码,编译器必须理解两个值相等意味着什么。对于像INT和枚举这样的项目,这是一个微不足道的比较。但是编译器应该如何比较两个字符串值呢?区分大小写,不敏感,文化意识等.如果没有对字符串的充分认识,就无法准确地回答这一问题。

此外,C/C+开关语句通常生成为分支表..为字符串样式的开关生成分支表并不是那么容易。


查看完整回答
反对 回复 2019-07-05
?
森林海

TA贡献2011条经验 获得超2个赞

如前所述,编译器喜欢构建优化的查找表。switch语句尽可能接近O(1)定时。结合C+语言没有字符串类型的事实-std::string是标准库的一部分,而标准库本身并不是语言的一部分。

我将提供一个你可能想考虑的替代方案,我过去曾使用过它,效果很好。与其切换字符串本身,不如切换使用字符串作为输入的哈希函数的结果。如果您使用的是一组预定的字符串,您的代码将几乎与切换字符串一样清晰:

enum string_code {
    eFred,
    eBarney,
    eWilma,
    eBetty,
    ...};string_code hashit (std::string const& inString) {
    if (inString == "Fred") return eFred;
    if (inString == "Barney") return eBarney;
    ...}void foo() {
    switch (hashit(stringValue)) {
    case eFred:
        ...
    case eBarney:
        ...
    }}

有许多明显的优化,它们几乎遵循C编译器对开关语句所做的操作.有趣的是那是怎么发生的。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 422 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信