2013-05-16 54 views
1

我有一個switch語句基於int比較,但由於某種原因,它在真正的比較中保持失敗,並跳到默認值。這裏是我的代碼:C++ int switch語句總是進入`default`

string Error(int errorNum, int send=1, int crash=1) 
{ 
    string errorType; 
    switch(errorNum) 
    { 
    case 10: 
     errorType = "Port number"; 
    ... 
    default: 
     errorType = "Unknown"; 
    } 
... 
} 

我跟上10參數調用它,但是當我做,它失敗。該equivelant if... else if... else方法的工作原理,在這裏它還有:

string Error(int errorNum, int send=1, int crash=1) 
{ 
    string errorType; 
    if (errorNum == 10)     // Normally I'd use braces, 
    errorType = "Port number";  // but here, it just clutters 
    ... 
    else 
    errorType = "Unknown"; 
    ... 
} 
+9

你沒有錯過添加你的'break's,是嗎? –

+3

''default'在'default'之前有'break'嗎?如果沒有,那麼它會看起來像是'默認',因爲它會通過。 –

回答

3

您可能會錯過break的情況。請確保在每個case的末尾包含break,否則它將進入下一個。

string Error(int errorNum, int send=1, int crash=1) 
{ 
    string errorType; 
    switch(errorNum) 
    { 
    case 10: 
     errorType = "Port number"; 
     break; // If this is not here it will fall throughto the next case or default 

    default: 
     errorType = "Unknown"; 
    } 
    return errorType; 
} 
+0

好的,4個答案在60秒內完成。哇。 – JShoe

+0

常見問題通常會得到相當多的反應。 –

4

如果你不使用break那麼所有後續的case語句將匹配的情況下,後執行。

因此,在您的情況下,它會執行兩個案例部分並覆蓋值errorType,這會給您一個直接跳轉到默認情況的印象。


要添加一個有趣的更新...

注意周圍有case語句括號也就沒有什麼區別。事實上,下面的代碼是有效的C++和預期將工作:

switch(var) 
{ 

    { 
    case 1: 
    cout<<"case 1"<<endl; 
    } 
    cout<<"This is also part of case 1"<<endl; 

    case 2: 
    { 
    cout<<"case 2 "<<endl; 
    } 

} 

注意括號沒有錯。

這裏的cout也是case 1的一部分。在評估控制表達式var後,控制將直接跳轉到匹配的情況。圍繞case 1的大括號僅僅引入了新的範圍,並且與案件的真實構成無關。所以正確的方法是,如果您不希望發生其他情況,請將break陳述。

2

您是否在默認情況下休息?如果不是,那麼它會看起來像是違約,因爲它會通過。

1

每個case語句都需要一個break子句,否則就會轉入下一個語句。

例如

case 10: 
     errorType = "Port number"; 
     break; 
    default: 
     errorType= "Unknown"; 
     break; 

http://msdn.microsoft.com/en-us/library/k0t5wee3(v=vs.80).aspx更多細節

根據您的情況,它甚至可能會更好,從交換機中返回的字符串。回報聲明不會落空

case 10: 
    return "Port number"; 
default: 
    return "Unknown";