113

我想从语句中间跳转到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++ 在这里的行为是否不同?

4

7 回答 7

64

没关系,该continue语句与封闭循环有关,您的代码应该等效于(避免此类跳转语句):

while (something = get_something()) {
    if (something == A || something == B)
        do_something();
}

但是,如果您希望break退出循环,正如您的评论所建议的那样(它总是用另一个东西再次尝试,直到它评估为假),您将需要一个不同的结构。

例如:

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();
于 2010-01-27T12:34:22.300 回答
29

是的,continue 会被 switch 语句忽略,会转到要测试的循环的条件。我想分享一下 Ritchie 的 The C Programming Language reference 的摘录:

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

continue 语句仅适用于循环,不适用于switch语句。A continueinside a switchinside a loop 导致下一次循环迭代。

对于 C++,我不确定。

于 2013-11-16T14:25:04.580 回答
21

是的,没关系——就像在if声明中使用它一样。当然,您不能使用 abreak从开关内部跳出循环。

于 2010-01-27T12:26:12.770 回答
8

它在语法上是正确的,风格上也不错。

良好的风格要求每条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...
}

...没关系。

于 2010-01-27T13:00:27.183 回答
5

虽然在技术上是有效的,但所有这些跳跃都模糊了控制流——尤其是continue语句。

我会使用这种技巧作为最后的手段,而不是第一个。

怎么样

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

它更短并且以更清晰的方式执行其内容。

于 2010-01-27T12:37:15.407 回答
-3

这可能晚了一点,但您可以使用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 及更高版本进行测试。

于 2019-10-08T13:38:55.863 回答
-5

Switch 不被视为循环,因此您不能在 switch 的 case 语句中使用Continue ...

于 2017-07-26T19:15:20.027 回答