我是否總是要從switch語句中取出break
;簡單地使用分號;
退出是不安全的嗎?打開switch語句
switch ((rand() % 2)) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
我是否總是要從switch語句中取出break
;簡單地使用分號;
退出是不安全的嗎?打開switch語句
switch ((rand() % 2)) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
考慮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;
不下降通過有被太棘手爲了你自己好獨特的代碼味道。
絕對。我想知道你在哪些目標之間劃出了「最佳重構」,「效率」和「可讀性」等目標。它聞起來 - 這就是爲什麼我發佈它! :D – user2000809
另外,對於達夫的例子,在Obj-C中他們更喜歡指針算法而不是OOP? – user2000809
@ user2000809在ObjC中,您通常會將純C或C++代碼隔離在純C API後面或封裝在ObjC類中。指針算術和其他相對較鈍的C-is當然是非常快速的,但將它們隔離在API後面會使得重構,測試和調試變得更加容易。 – bbum
A ;
不會阻止控件落入下一條語句。
因此,總是使用break;
與switch
並沒有好的選擇。
A ;
只是一個語句終結者。
根據你的代碼,
case 1:
// Do nothing
;
如果你的情況無關這真的不是必需的。你可以簡單地省略這個。
真的,我可以省略供私人使用。爲了保持完整性,我留下了評論意見,所以很明顯,編碼在API – user2000809
分號不會退出交換機。否則,每個語句(以分號結束)都會退出交換機。
如果您不添加中斷,則會執行下一個案例。你的情況上面它可能工作爲default
旁邊,它是空的,但通常是你的代碼會做意想不到的事情......
中是刻意的(而不是說,忘記)。這是比我更簡潔和準確的答案,但我一直想要藉口把達夫的裝置扔到SO ... – bbum
@bbum不錯。如何(以及爲什麼不應該)使用不添加「break」的功能的好解釋。 – Wain
是的,它不會「退出」開關,因爲我打算讓它掉下來並且什麼都不做 - 所以這不會導致任何錯誤,因爲'switch'範圍以括號結束? – user2000809
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/
搜索「的選擇結構:開關」
......如果你將'switch'和'goto'混合在一起....好吧,不要! – bbum
還是不要用'goto'? 'goto'被認爲是有害的* – user2000809
我從來沒有建議使用'goto' –
一句話:是 –