C++ 在 switch 语句中使用 continue
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2146763/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using continue in a switch statement
提问by Matt Joiner
I want to jump from the middle of a switch
statement, to the loop statement in the following code:
我想从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();
}
Is this a valid way to use continue
? Are continue
statements ignored by switch
statements? Do C and C++ differ on their behaviour here?
这是一种有效的使用方式continue
吗?continue
语句是否被语句忽略switch
?C 和 C++ 在这里的行为是否有所不同?
采纳答案by visitor
It's fine, the continue
statement relates to the enclosing loop, and your code should be equivalent to (avoiding such jump statements):
没关系,该continue
语句与封闭循环有关,并且您的代码应等效于(避免此类跳转语句):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
But if you expect break
to exit the loop, as your comment suggest (it always tries again with another something, until it evaluates to false), you'll need a different structure.
但是,如果您希望break
退出循环,正如您的评论所暗示的那样(它总是用另一个东西再次尝试,直到它评估为假),您将需要一个不同的结构。
For example:
例如:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
回答by visitor
Yes, it's OK - it's just like using it in an if
statement. Of course, you can't use a break
to break out of a loop from inside a switch.
是的,没关系 - 就像在if
语句中使用它一样。当然,您不能使用 abreak
从交换机内部跳出循环。
回答by Islam Elshahat
Yes, continue will be ignored by the switch statement and will go to the condition of the loop to be tested. I'd like to share this extract from The C Programming Language reference by Ritchie:
是的,continue 将被 switch 语句忽略,并会转到要测试的循环条件。我想分享 Ritchie 的 The C Programming Language 参考中的摘录:
The
continue
statement is related tobreak
, but less often used; it causes the next iteration of the enclosingfor
,while
, ordo
loop to begin. In thewhile
anddo
, this means that the test part is executed immediately; in thefor
, control passes to the increment step.The continue statement applies only to loops, not to a
switch
statement. Acontinue
inside aswitch
inside a loop causes the next loop iteration.
该
continue
语句与 相关break
,但较少使用;它会导致封闭的下一次迭代for
,while
或do
循环开始。在while
and 中do
,这意味着测试部分立即执行;在 中for
,控制传递到增量步骤。continue 语句仅适用于循环,不适用于
switch
语句。Acontinue
inside aswitch
inside 循环导致下一次循环迭代。
I'm not sure about that for C++.
对于 C++,我不确定这一点。
回答by SF.
It's syntactically correct and stylistically okay.
它在语法上是正确的,在风格上也没有问题。
Good style requires every case:
statement should end with one of the following:
好的风格要求每条case:
语句都应以以下之一结尾:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
Additionally, following case (x):
immediately with
此外,case (x):
立即跟随
case (y):
default:
is permissible - bundling several cases that have exactly the same effect.
是允许的 - 捆绑几个具有完全相同效果的案例。
Anything else is suspected to be a mistake, just like if(a=4){...}
Of course you need enclosing loop (while
, for
, do...while
) for continue
to work. It won't loop back to case()
alone. But a construct like:
其他任何东西都被怀疑是错误的,就像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...
}
...is okay.
...没关系。
回答by Alexander Poluektov
While technically valid, all these jumps obscure control flow -- especially the continue
statement.
虽然技术上有效,但所有这些跳转都掩盖了控制流——尤其是continue
语句。
I would use such a trick as a last resort, not first one.
我会使用这样的技巧作为最后的手段,而不是第一个。
How about
怎么样
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
It's shorter and perform its stuff in a more clear way.
它更短,并以更清晰的方式执行其内容。
回答by Adrian S
This might be a megabit to late but you can use continue 2
.
这可能有点晚了,但您可以使用continue 2
.
Some php builds / configs will output this warning:
某些 php 构建/配置将输出此警告:
PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
PHP 警告:“continue”定位开关等同于“break”。您的意思是使用“继续 2”吗?
For example:
例如:
$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";
}
This will output:
这将输出:
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
Tested with PHP 5.5 and higher.
使用 PHP 5.5 及更高版本进行测试。
回答by Jitendra Nagar
Switch is not considered as loop so you cannot use Continueinside a case statement in switch...
Switch 不被视为循环,因此您不能在 switch 的 case 语句中使用Continue...