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

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

编译以下代码并得到type illegal.

int main(){
    // Compilation error - switch expression of type illegal
    switch(std::string("raj"))
    {
    case"sda":
    }}

您不能在其中使用字符串。switchcase..为什么?是否有任何解决方案可以很好地支持类似于打开字符串的逻辑?


浮云间
浏览 426回答 3
3回答

皈依舞

其原因与类型系统有关。C/C+并不真正支持字符串作为一种类型。它确实支持常量char数组的概念,但它并不完全理解字符串的概念。为了生成开关语句的代码,编译器必须理解两个值相等意味着什么。对于像INT和枚举这样的项目,这是一个微不足道的比较。但是编译器应该如何比较两个字符串值呢?区分大小写,不敏感,文化意识等.如果没有对字符串的充分认识,就无法准确地回答这一问题。此外,C/C+开关语句通常生成为分支表..为字符串样式的开关生成分支表并不是那么容易。

森林海

如前所述,编译器喜欢构建优化的查找表。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编译器对开关语句所做的操作.有趣的是那是怎么发生的。
打开App,查看更多内容
随时随地看视频慕课网APP