2017-09-13 43 views
0

我剛剛解決了第一個練習learncpp, chaper 7.8。我測試了它們的開關循環版本,它的工作原理,但我不知道它沒有break,不應該在這種情況下這樣的代碼導致不受歡迎的行爲?我什麼時候可以離開break什麼時候可以在開關循環中省略「break」?

這裏是我的版本(這也可以正常工作):

switch (op) 
    { 
    case '+': { 
     return add; 
      break;} 
    case '-': { 
     return subtract; 
     break;} 
    case '*': { 
     return multiply; 
     break;} 
    case '/': { 
     return divide; 
     break;} 
    default: ; 
    } 
+12

第一個'switch'不是一個循環。在return語句之後不需要有'break'語句。 – user0042

+1

這取決於你是否想要通過或不通過。如果你不需要「休息」。如果沒有,那麼你不。 – NathanOliver

+4

閱讀「break」和「return」做什麼,答案將變得清晰。不要依賴測試來學習C++。 – nwp

回答

4

注意,C++不您使用break上堅持,但往往switch案件依靠他們,以避免有用跟進功能。

你可以在你的程序中刪除沒有效果break如果程序控制從未到達的那樣:return語句後break陳述都不是到達,這樣你就可以安全地刪除它們。

您也不需要一個空的default標籤。

8

如果沒有break,執行流程將繼續到下一個案例 - 除非您以其他方式跳轉(如return ing,在您的情況下)。這被稱爲下翻

這是否是一個錯誤取決於程序。

switch (op) 
{ 
    case '+': 
     return add; 
     break; // these breaks do nothing - we have already returned! 
    case '-': 
     return subtract; 
     break; 
    case 'x': // fall through to '*' 
    case '*': 
     return multiply; 
     break; 
    case '/': 
     return divide; 
     break; 
} 
+0

一個很好的例子,在行動中是通過[Duff's Device](https://stackoverflow.com/questions/514118/how-does-duffs-device-work) – user4581301

3

既然你是新的C++,認爲:

  • 任何時候你的代碼達到return如果(舉例來說)你想多case s到具有相同的作用它可以是有用的語句,您當前的函數/方法將結束並返回指定的值,而不執行任何更多的代碼行。所以你的break聲明永遠不會被達成。

  • 當達到break,電流switchwhilefor將結束。流量將繼續超出其範圍{...}

  • 如果您沒有在switch case中使用break,那麼流程會繼續進行(甚至到下一個案例)。

2

這可能是有用的,你要了解什麼是switch在幕後做。

主要是:

enum command { 
    add, subtract, multiply, divide, error 
}; 

command foo(char op) 
{ 
    switch (op) 
    { 
    case '+': { 
     return add; 
      break;} 
    case '-': { 
     return subtract; 
     break;} 
    case '*': { 
     return multiply; 
     break;} 
    case '/': { 
     return divide; 
     break;} 
    default: 
     break; 
    } 
    return error; 
} 

在邏輯上是一樣的:

command foo_that_will_give_people_seizures(char op) 
{ 
    if (op == '+') goto plus_; 
    if (op == '-') goto minus_; 
    if (op == '*') goto mpy_; 
    if (op == '/') goto div_; 
    goto break_; 

    plus_: 
    return add; 
    goto break_; // notice how this statement cannot be reached. 

    minus_: 
    return subtract; 

    mpy_: 
    return multiply; 

    div_: 
    return divide; 

    break_: 
     ; 
    return error; 
} 

,並出現在任何的第一功能的情況下,聲明break;相當於第二goto break_

ps。你不會贏得任何編寫這樣的代碼的朋友。人們喜歡假裝goto是在C壞事++ ;-)

1

你應該知道,休息應在default:被排除在外(如果默認是最後的情況),其中代碼流基本達到結束,沒有按不需要得到break

break的目的是防止代碼在實際案例爲真時繼續下一個案例。然而,return返回案例中的給定語句,並打破switch。如果您正在考慮返回switch個案,那麼您可以使用return foobar;而不是使用break,它會通過返回您希望返回的任何內容而中斷。

相關問題