2017-08-28 73 views
-4

本質上說,我的開關櫃不能正常工作,因爲我認爲不符合條件的那些語句正在執行。開關櫃「出現」不能正常工作C++

示例輸入:

CerseiTyrion 

預期輸出:

Cersei 
Tyrion 

實際輸出:

Cersei 
Tyrion 
Jon 
Dany 
Tyrion 
Jon 
Dany 

以下功能的目標是解析爲一個冒險遊戲的一些輸入文本,並讓遊戲瞭解文本中包含的一些重要信息。然後,它繼續使用它發現的執行代碼,如果滿足某些條件,該代碼應始終與該函數的其餘部分一起運行。

最小,完整;覈查的例子:

void HandleGameState(const std::string& text) { 

    enum Characters { 
     Cersei = 0x01, 
     Tyrion = 0x02, 
     Jon = 0x04, 
     Dany = 0x08 
    }; 

    unsigned int mask = 1; 

    switch(characterMask & mask) 
    { 
     case Cersei: 
     { 
     std::cout << "Cersei" << std::endl; 
     }; 
     case Tyrion: 
     { 
     std::cout << "Tyrion" << std::endl; 
     }; 
     case Jon: 
     { 
     std::cout << "Jon" << std::endl; 
     }; 
     case Dany: 
     { 
     std::cout << "Dany" << std::endl; 
     }; 
    } 
} 
+2

只要在每個病例陳述結束後加上'break'即可。 – zindarod

+0

我們通常在每個案例之後都會有一個「break」,以使其不會落入下一個案例。 –

+2

從GoT開始休息一下吧:) – ABcDexter

回答

5

您需要將開關例break語句完成,否則代碼繼續到下一個case標籤。

反直覺對一些人來說,switch不是美化多if聲明,而是一個榮耀goto聲明。每個病例標籤的行爲如同goto標籤,並且缺少break,代碼將繼續執行。

當兩個不同的案例標籤需要產生相同的輸出時,通常使用這種方式 - 而不是複製代碼,標籤只是一個接一個地放置。例如:

switch (x) { 
    case 1: // fall through 
    case 2: work_one_or_two(); break; 
    ... 
} 
+0

解釋'case'的_label_本質的好答案(不幸的是,一個瑣事問題)。 – user0042

+0

謝謝你的答案! :) –

2

你必須使用breakcase後面。

開關/事件規則很簡單,在一個事件發生後,所有後續事件將被執行,直到中斷;或開關的結束。