打破switch语句

时间:2013-06-24 15:23:57

标签: objective-c c scope switch-statement break

我是否总是需要break来自switch语句;简单地用分号;退出是不安全的?

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

4 个答案:

答案 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/

搜索“选择性结构:切换”