2013-06-24 57 views
1

我是否總是要從switch語句中取出break;簡單地使用分號;退出是不安全的嗎?打開switch語句

switch ((rand() % 2)) { 
    case 0: 
    // Do foo; 
    break; 
    case 1: 
    // Do nothing 
    ; 
    default: 
    ; 
} 
+2

一句話:是 –

回答

16

考慮Duff's Device(一個函數,複製N個字節從內存中的一個點到另一個):

send(to, from, count) 
register short *to, *from; 
register count; 
{ 
     register n = (count + 7)/8; 
     switch(count % 8) { 
     case 0: do { *to = *from++; 
     case 7:   *to = *from++; 
     case 6:   *to = *from++; 
     case 5:   *to = *from++; 
     case 4:   *to = *from++; 
     case 3:   *to = *from++; 
     case 2:   *to = *from++; 
     case 1:   *to = *from++; 
       } while(--n > 0); 
     } 
} 

它只適用 - 是的,它真的有效 - 因爲所有的情況下跌到下一個,因爲沒有案件使用break;。所以,是的,你必須使用break;退出case,但下降到case可能是有用的。

雖然,如達夫設備簡潔證明,通過使用break;下降通過有被太棘手爲了你自己好獨特的代碼味道。

+0

絕對。我想知道你在哪些目標之間劃出了「最佳重構」,「效率」和「可讀性」等目標。它聞起來 - 這就是爲什麼我發佈它! :D – user2000809

+0

另外,對於達夫的例子,在Obj-C中他們更喜歡指針算法而不是OOP? – user2000809

+1

@ user2000809在ObjC中,您通常會將純C或C++代碼隔離在純C API後面或封裝在ObjC類中。指針算術和其他相對較鈍的C-is當然是非常快速的,但將它們隔離在API後面會使得重構,測試和調試變得更加容易。 – bbum

2

A ;不會阻止控件落入下一條語句。

因此,總是使用break;switch並沒有好的選擇。

A ;只是一個語句終結者。


根據你的代碼,

case 1: 
    // Do nothing 
    ; 

如果你的情況無關這真的不是必需的。你可以簡單地省略這個。

+0

真的,我可以省略供私人使用。爲了保持完整性,我留下了評論意見,所以很明顯,編碼在API – user2000809

13

分號不會退出交換機。否則,每個語句(以分號結束)都會退出交換機。

如果您不添加中斷,則會執行下一個案例。你的情況上面它可能工作爲default旁邊,它是空的,但通常是你的代碼會做意想不到的事情......

+0

中是刻意的(而不是說,忘記)。這是比我更簡潔和準確的答案,但我一直想要藉口把達夫的裝置扔到SO ... – bbum

+0

@bbum不錯。如何(以及爲什麼不應該)使用不添加「break」的功能的好解釋。 – Wain

+0

是的,它不會「退出」開關,因爲我打算讓它掉下來並且什麼都不做 - 所以這不會導致任何錯誤,因爲'switch'範圍以括號結束? – user2000809

2

switch語句只能處理常量並且需要中斷纔有原因。 交換機使用不帶條件的標籤來實現。

switch (x){ 
    case 1: printf("1"); break; 
    case 2: printf("2"); break; 
} 

goto label_x; // where x is replaced with it's value 
label_1: 
     printf("1"); 
     break; 
label_2: 
     printf("2"); 
     break; 

相當於這就是爲什麼在C/C++,如果你不把休息它只會繼續的下一行代碼(落空)。

你應該在這裏檢查C++控制結構: http://www.cplusplus.com/doc/tutorial/control/

搜索「的選擇結構:開關」

+3

......如果你將'switch'和'goto'混合在一起....好吧,不要! – bbum

+0

還是不要用'goto'? 'goto'被認爲是有害的* – user2000809

+1

我從來沒有建議使用'goto' –