在 switch 语句中使用 keep

我想从 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 + + 在这方面的行为有什么不同吗?

157715 次浏览

是的,没关系——就像在 if语句中使用它一样。当然,您不能使用 break从开关内部打破循环。

没关系,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();

虽然技术上是有效的,但是所有这些跳转都模糊了控制流——特别是 continue语句。

我会用这种把戏作为最后的手段,而不是第一次。

怎么样

while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}

它更短,表现的更清晰。

句法上正确,文体上也没问题。

好的风格要求每个 case:语句应以下列其中之一结束:

 break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough

此外,在 case (x):之后立即使用

 case (y):
default:

是允许的-捆绑几个情况下,具有完全相同的效果。

任何其他的东西都被怀疑是错误的,就像 if(a=4){...} 当然,你需要封闭的循环(whilefordo...while)为 continue的工作。它不会单独回到 case()。但是这样的结构是:

while(record = getNewRecord())
{
switch(record.type)
{
case RECORD_TYPE_...;
...
break;
default: //unknown type
continue; //skip processing this record altogether.
}
//...more processing...
}

没关系。

是的,继续将被 switch 语句忽略,并转到要测试的循环的状态。 我想和大家分享一下 Ritchie 的 C 语言编程参考:

continue语句与 break相关,但使用较少; 它导致开始下一个封闭 forwhiledo循环的迭代。在 whiledo中,这意味着测试部分立即执行; 在 for中,控制传递到增量步骤。

The continue statement applies only to loops, not to a switch statement. A continue inside a switch inside a loop causes the next loop iteration.

对于 C + + 我不太确定。

开关不被视为循环,因此您不能在 Switch 中的 case 语句中使用 继续..。