2014-02-25 70 views
2

我開始掌握C++,但有一件事讓我困惑,它使用break和select case。我知道如何做到這一點,但我想知道的是爲什麼會發生這種特定的操作。帶開關語句的C++邏輯

說如果我有

switch (Tasty) 
{ 
    case true: 
    cout << "yum" << endl; 
    break; 
    case false: 
    cout << "erch" << endl; 
    break; 
} 

現在正確地做它,並打印出我想要的東西,但如果我不

switch (Tasty) 
{ 
    case true: 
    cout << "yum" << endl; 
    case false: 
    cout << "erch" << endl; 
} 

爲什麼會同時打印「蔭」和「erch」 ?

+1

如果沒有「break」,它會「落入」下一個case。 – crashmstr

+1

閱讀此前的答案爲[通過原因中斷聲明](http://stackoverflow.com/a/252733/1079907)。 –

+0

請注意,對於布爾值,使用'if(Tasty)... else ...'這是更有意義,在你的情況下'if(Tasty){cout <<「yum」<< endl; } else {cout <<「erch」<< endl; }' – leemes

回答

8

switch語句中的例子最好被認爲是標籤。

cout << "yum" << endl; 

運行完聲明之後,下一個簡單的開始運行,

cout << "erch" << endl; 

,除非你明確breakswitch聲明。

+0

它被稱爲貫徹http://en.wikipedia.org/wiki/Switch_statement#Fallthrough,並且確實會一直導致錯誤,我從來沒有見過沒有中斷的switch語句,這很有用。但我想有些情況下可能會阻止代碼重複。 –

+0

http://en.wikipedia.org/wiki/Duff%27s_device – Brian

2

如果您不使用break關鍵字,程序將繼續執行以下說明。有時候這會派上用場,但大多數時候這只是屁股疼痛。

在你的情況下,如果Tastytrue,這兩個單詞將被打印。如果false,只有第二個。

1

在大多數情況下,交換機* 需要中斷,除非您明確希望交換機進入其他情況。 無論是否中斷,交換機都會逐行下移。一些像C#這樣的語言會自動捕獲這些並阻止編譯。 C++會讓你做主不過,所以你必須要小心添加這些英寸

switch(Tasty) 
{ 
    case true: 
     cout << "yum" ; 
     break; /*<--- don't forget the break!*/ 
    case false: 
     cout << "not yum"; 
     break; 
} 
+1

休息並不總是需要的,它發生在你不想休息的某些情況下。確實,在99%的情況下,你會在那裏休息一下,因爲這是你想要做的,但這不是一個規則。 – Raxvan

+0

我知道。但在這種情況下,OP應該永遠不會忘記休息。 – 173901

1

switch陳述案件執行,直到一個是true(再下一個,除非你breakswitch也正在執行)或直到所有條件都經過測試。

檢查此示例:

int Tasty = 1; 
    switch (Tasty) 
    { 
     case 1: 
      qDebug() << "yum" << endl; 
     case 2: 
      qDebug() << "erch" << endl; 
    } 

輸出:

erch

int Tasty = 1; 
    switch (Tasty) 
    { 
     case 2: 
      qDebug() << "yum" << endl; 
     case 1: 
      qDebug() << "erch" << endl; 
    } 

輸出:

erch

0

據CPLUSPLUS。com 「 它工作的方式如下:switch計算表達式並檢查它是否等於constant1;如果是,它將執行group-of-statements-1,直到找到break語句爲止,當它找到這個break語句時,程序跳轉到整個switch語句(右大括號)的末尾。「

因此,如果您不放置break語句,它會自動轉到下一個case,並且它會一直持續到找到break語句爲止。點擊此鏈接瞭解更多信息。

http://www.cplusplus.com/doc/tutorial/control/

5

答案這裏是不錯的,我只是想給你一個例子,其中省略break實際上是有用的:

case你不能檢查多個值,像1 || 2 || 3,所以如果要執行相同功能的多個值的選擇是將重複的代碼,這樣的事情:

switch (a) 
{ 
    case 1: 
    Foo(); 
    break; 

    case 2: 
    Foo(); 
    break; 

    case 3: 
    Foo(); 
    break; 

    case 4: 
    Bar(); 
    break; 
} 

,除非你忽略break的你可以這樣寫:

switch (a) 
{ 
    case 1: 
    case 2: 
    case 3: 
    Foo(); 
    break; 

    case 4: 
    Bar(); 
    break; 
} 

如果可能的話,代碼重複總是可以避免的,所以這實際上派上用場了。