在switch语句中使用continue

时间:2010-01-27 12:24:21

标签: c++ c switch-statement break continue

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

7 个答案:

答案 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相关,但较少使用;它会导致封闭的forwhiledo循环的下一次迭代开始。在whiledo中,这意味着测试部分立即执行;在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封闭循环(fordo...whilecontinue)才能正常工作。它不会单独循环回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及更高版本的测试。