我想从switch
语句的中间跳转到以下代码中的循环语句:
while (something = get_something())
{
switch (something)
{
case A:
case B:
break;
default:
// get another something and try again
continue;
}
// do something for a handled something
do_something();
}
这是使用continue
的有效方法吗? continue
语句是否忽略switch
个语句? C和C ++在这方面的行为有何不同?
答案 0 :(得分:50)
没关系,continue
语句与封闭循环有关,你的代码应该等同于(避免这样的跳转语句):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
但是如果你希望break
退出循环,正如你的评论建议的那样(它总是再次尝试另一个东西,直到它的计算结果为false),你需要一个不同的结构。
例如:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
答案 1 :(得分:19)
是的,没关系 - 就像在if
声明中使用它一样。当然,你不能使用break
来打开交换机内部的循环。
答案 2 :(得分:8)
是的,switch语句将忽略continue,并将转到要测试的循环的条件。 我想与Ritchie的C编程语言参考文献分享这个摘录:
continue
语句与break
相关,但较少使用;它会导致封闭的for
,while
或do
循环的下一次迭代开始。在while
和do
中,这意味着测试部分立即执行;在for
中,控件转到增量步骤。continue语句仅适用于循环,而不适用于
switch
语句。循环内continue
内的switch
会导致下一次循环迭代。
对于C ++,我不确定。
答案 3 :(得分:6)
它在语法上是正确的,风格上还可以。
良好的风格要求每个case:
语句都应以下列之一结束:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
此外,立即跟随case (x):
case (y):
default:
是允许的 - 捆绑几个具有完全相同效果的案例。
其他任何事都被怀疑是错误的,就像if(a=4){...}
一样
当然,您需要为while
封闭循环(for
,do...while
,continue
)才能正常工作。它不会单独循环回case()
。但是构造如下:
while(record = getNewRecord())
{
switch(record.type)
{
case RECORD_TYPE_...;
...
break;
default: //unknown type
continue; //skip processing this record altogether.
}
//...more processing...
}
......没关系。
答案 4 :(得分:5)
虽然技术上有效,但所有这些跳转都会掩盖控制流 - 尤其是continue
语句。
我会使用这样的技巧作为最后的手段,而不是第一个。
怎么样
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
它更短,并以更清晰的方式执行其中。
答案 5 :(得分:-1)
开关不被视为循环,因此您无法在开关中的案例陈述中使用继续 ...
答案 6 :(得分:-1)
这可能太迟了,但是您可以使用continue 2
。
某些php构建/配置将输出以下警告:
PHP警告:“继续”定向开关等效于“中断”。您是要使用“继续2”吗?
例如:
$i = 1;
while ($i <= 10) {
$mod = $i % 4;
echo "\r\n out $i";
$i++;
switch($mod)
{
case 0:
break;
case 2:
continue;
break;
default:
continue 2;
break;
}
echo " is even";
}
这将输出:
out 1
out 2 is even
out 3
out 4 is even
out 5
out 6 is even
out 7
out 8 is even
out 9
out 10 is even
经过PHP 5.5及更高版本的测试。