难道我总是要break
退出一个switch语句;;
简单地用分号退出 是不安全的吗?
switch ( (rand() % 2) ) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
难道我总是要break
退出一个switch语句;;
简单地用分号退出 是不安全的吗?
switch ( (rand() % 2) ) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
考虑Duff 的设备(一个将 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;
具有明显的代码气味,即对您自己的利益来说太棘手了。
分号不会退出开关。否则,每条语句(以分号结尾)都将退出切换。
如果不加break,就会执行下一个case。在您上面的情况下,它可能会像default
下一个一样工作并且它是空的,但通常您的代码会做意想不到的事情......
A;
不会阻止控件落入下一条语句。
所以总是使用break;
withswitch
并且没有好的选择。
A;
只是一个语句终止符。
根据您的代码,
case 1:
// Do nothing
;
如果您的情况与此无关,这实际上不是必需的。你可以简单地省略它。
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/
搜索“选择性结构:开关”