我是否总是要从switch语句中取出break
;简单地使用分号;
退出是不安全的吗?打开switch语句
switch ((rand() % 2)) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
我是否总是要从switch语句中取出break
;简单地使用分号;
退出是不安全的吗?打开switch语句
switch ((rand() % 2)) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
考虑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;
不下降通过有被太棘手为了你自己好独特的代码味道。
绝对。我想知道你在哪些目标之间划出了“最佳重构”,“效率”和“可读性”等目标。它闻起来 - 这就是为什么我发布它! :D – user2000809
另外,对于达夫的例子,在Obj-C中他们更喜欢指针算法而不是OOP? – user2000809
@ user2000809在ObjC中,您通常会将纯C或C++代码隔离在纯C API后面或封装在ObjC类中。指针算术和其他相对较钝的C-is当然是非常快速的,但将它们隔离在API后面会使得重构,测试和调试变得更加容易。 – bbum
A ;
不会阻止控件落入下一条语句。
因此,总是使用break;
与switch
并没有好的选择。
A ;
只是一个语句终结者。
根据你的代码,
case 1:
// Do nothing
;
如果你的情况无关这真的不是必需的。你可以简单地省略这个。
真的,我可以省略供私人使用。为了保持完整性,我留下了评论意见,所以很明显,编码在API – user2000809
分号不会退出交换机。否则,每个语句(以分号结束)都会退出交换机。
如果您不添加中断,则会执行下一个案例。你的情况上面它可能工作为default
旁边,它是空的,但通常是你的代码会做意想不到的事情......
中是刻意的(而不是说,忘记)。这是比我更简洁和准确的答案,但我一直想要借口把达夫的装置扔到SO ... – bbum
@bbum不错。如何(以及为什么不应该)使用不添加“break”的功能的好解释。 – Wain
是的,它不会“退出”开关,因为我打算让它掉下来并且什么都不做 - 所以这不会导致任何错误,因为'switch'范围以括号结束? – user2000809
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/
搜索“的选择结构:开关”
......如果你将'switch'和'goto'混合在一起....好吧,不要! – bbum
还是不要用'goto'? 'goto'被认为是有害的* – user2000809
我从来没有建议使用'goto' –
一句话:是 –