我是否总是需要break
来自switch语句;简单地用分号;
退出是不安全的?
switch ( (rand() % 2) ) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
答案 0 :(得分: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
可能会有用。
尽管如Duff的设备简明扼要地说明的那样,使用break;
通过而不是而有一个明显的代码味道,因为对你自己的好来说太棘手了。< / p>
答案 1 :(得分:13)
分号不会退出开关。否则,每个语句(以分号结尾)都将退出交换机。
如果您不添加中断,则会执行下一个案例。在你的情况下,它可能会工作,因为default
是下一个,它是空的,但通常你的代码会做出意想不到的事情...
答案 2 :(得分:2)
;
不会阻止控件落入下一个语句。
因此始终将break;
与switch
一起使用,并且没有其他好选择。
;
只是一个语句终止符。
根据您的代码,
case 1:
// Do nothing
;
如果您的案件无关,则确实不需要这样做。你可以简单地省略它。
答案 3 :(得分:2)
有一个原因,为什么switch语句只适用于常量,需要中断。 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/
搜索“选择性结构:切换”