2013-06-24 45 views
1

我是否总是要从switch语句中取出break;简单地使用分号;退出是不安全的吗?打开switch语句

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

一句话:是 –

回答

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可能是有用的。

虽然,如达夫设备简洁证明,通过使用break;下降通过有被太棘手为了你自己好独特的代码味道。

+0

绝对。我想知道你在哪些目标之间划出了“最佳重构”,“效率”和“可读性”等目标。它闻起来 - 这就是为什么我发布它! :D – user2000809

+0

另外,对于达夫的例子,在Obj-C中他们更喜欢指针算法而不是OOP? – user2000809

+1

@ user2000809在ObjC中,您通常会将纯C或C++代码隔离在纯C API后面或封装在ObjC类中。指针算术和其他相对较钝的C-is当然是非常快速的,但将它们隔离在API后面会使得重构,测试和调试变得更加容易。 – bbum

2

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

因此,总是使用break;switch并没有好的选择。

A ;只是一个语句终结者。


根据你的代码,

case 1: 
    // Do nothing 
    ; 

如果你的情况无关这真的不是必需的。你可以简单地省略这个。

+0

真的,我可以省略供私人使用。为了保持完整性,我留下了评论意见,所以很明显,编码在API – user2000809

13

分号不会退出交换机。否则,每个语句(以分号结束)都会退出交换机。

如果您不添加中断,则会执行下一个案例。你的情况上面它可能工作为default旁边,它是空的,但通常是你的代码会做意想不到的事情......

+0

中是刻意的(而不是说,忘记)。这是比我更简洁和准确的答案,但我一直想要借口把达夫的装置扔到SO ... – bbum

+0

@bbum不错。如何(以及为什么不应该)使用不添加“break”的功能的好解释。 – Wain

+0

是的,它不会“退出”开关,因为我打算让它掉下来并且什么都不做 - 所以这不会导致任何错误,因为'switch'范围以括号结束? – user2000809

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/

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

+3

......如果你将'switch'和'goto'混合在一起....好吧,不要! – bbum

+0

还是不要用'goto'? 'goto'被认为是有害的* – user2000809

+1

我从来没有建议使用'goto' –