亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不能將開關語句應用于字符串?

為什么不能將開關語句應用于字符串?

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 關注
  • 514 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號