2011-11-05 30 views
19
int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
} 

上面的代碼是有效的嗎? 看看我是否非常確定int a不會有任何值而不是1和0,那麼在這種情況下我可以避免默認值:?如果我不在開關盒中寫入默認值,該怎麼辦?

如果無論如何一個值會不同於1和0?

編輯:我知道這是愚蠢的問題,但我想,也許這將是非法的或不確定的行爲,因此只是要求,以確保

+6

我已經嘗試過,但我在想,也許這將是非法或未定義的行爲,所以只是要求確保 –

+0

在這種情況下,我總是把一個默認值,並拋出一個異常。現在在C#7中,我更傾向於使用「case when」來覆蓋所有可能的情況,並使用default來覆蓋不可能的情況。道格拉斯亞當斯會理解這個觀點。 – Paulustrious

回答

47

代碼有效。如果沒有default:標籤且case標籤都不匹配「切換」值,則不會執行任何受控複合語句。執行將從switch語句的末尾繼續。

ISO/IEC 9899:1999,節6.8.4.2:

[...]如果沒有轉換case常量表達式匹配並且不存在default標籤,則不執行所述開關主體的一部分。

2

它是有效的不是有一個default情況。

但是,即使您確定您不會有任何價值而不是1和0,但最好有一個默認情況以捕獲任何其他值(儘管理論上不可能,但它可能會出現在某些情況下,如緩衝區溢出)並打印出錯。

+0

你假設這是一個不符合案件陳述之一的錯誤 - 在這種情況下可能是正確的。您可能只想執行某個變量的某些可能值的操作,並在其他情況下繼續執行。恕我直言,這是一個完全合理的使用switch語句。 –

+0

@Charles:他在問題中寫道:看看我是否非常確定int a沒有任何價值,而不是1和0,那麼在這種情況下,我可以避免默認值: –

+1

我並不是不同意你,如果遇到這種情況,很抱歉。我只是指出,雖然總的來說,有一個「默認」標籤是一個好習慣,但省略一個標籤並不一定是壞習慣。 –

7

這是完全合法的代碼。如果a不是0或1,那麼開關塊將被完全跳過。

2

是上面的代碼是有效的,

如果開關狀態不匹配的情況下的任何條件和默認不存在程序執行繼續從交換機退出而不做任何事情。

21

正如其他人指出的那樣,它是完全有效的代碼。但是,從編碼風格的角度來看,我更願意在評論中添加一個空的default聲明,以表明我沒有無意中忘記它。

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

使用/不使用default生成的代碼應該是相同的。

+3

+1用於溝通意圖。 – weberc2

+0

+1我用Google搜索了一個這樣的答案。 – Suzi

+1

如果您打算處理枚舉中的所有情況,我會建議*省略*默認情況,因爲大多數編譯器會警告在枚舉語句中是否忘記枚舉情況。 – rdb

-2

我建議每個案例必須有一個default:在這樣結束就像這個代碼! ,這將是很好有一個default:案例如果有什麼錯誤發生,或更改你可以警告用戶一個錯誤的值

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

但仍的情況下可以不default:,像運行如果聲明,你可以運行if()而不是else()

+1

這是如何回答這個問題的?還有什麼補充說,在接受的答案中沒有說過? (另外,你應該考慮失去感嘆號。) –

1

如果條件匹配並且沒有提供,它與no是相同的。

默認不是開關箱中的強制。如果沒有匹配的情況,並且沒有提供默認值,則不執行任何操作。

2

默認不是強制性的,但總是很好。代碼是理想的,但我們的生活不是,在這裏提供保護並不是什麼壞處。如果發生意外事件,它也會幫助你調試。

相關問題