1

难道我总是要break退出一个switch语句;;简单地用分号退出 是不安全的吗?

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

4 回答 4

16

考虑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;具有明显的代码气味,即对您自己的利益来说太棘手了

于 2013-06-24T15:30:10.277 回答
12

分号不会退出开关。否则,每条语句(以分号结尾)都将退出切换。

如果不加break,就会执行下一个case。在您上面的情况下,它可能会像default下一个一样工作并且它是空的,但通常您的代码会做意想不到的事情......

于 2013-06-24T15:25:43.183 回答
2

A;不会阻止控件落入下一条语句。

所以总是使用break;withswitch并且没有好的选择。

A;只是一个语句终止符。


根据您的代码,

case 1:
    // Do nothing
    ;

如果您的情况与此无关,这实际上不是必需的。你可以简单地省略它。

于 2013-06-24T15:25:30.700 回答
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/

搜索“选择性结构:开关”

于 2013-06-24T15:37:36.207 回答