Mat*_*ner 74 c c++ continue break switch-statement
我想从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();
}
Run Code Online (Sandbox Code Playgroud)
这是一种有效的使用方式continue
吗?continue
语句是否忽略了switch
语句?C和C++在这方面的行为有何不同?
vis*_*tor 51
没关系,continue
语句与封闭循环有关,你的代码应该等同于(避免这样的跳转语句):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
Run Code Online (Sandbox Code Playgroud)
但是如果你希望break
退出循环,就像你的评论所暗示的那样(它总是再次尝试另一个东西,直到它的计算结果为false),你需要一个不同的结构.
例如:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
Run Code Online (Sandbox Code Playgroud)
小智 20
是的,没关系 - 就像在if
声明中使用它一样.当然,你不能使用a break
来打开交换机内部的循环.
小智 10
是的,switch语句将忽略continue,并将进入要测试的循环的条件.我想与Ritchie的C编程语言参考文献分享这个摘录:
该
continue
陈述与[break
但较少使用]相关; 它会导致封闭的下一次迭代for
,while
或do
循环开始.在while
和中do
,这意味着测试部分立即执行; 在for
,控制传递到增量步骤.continue语句仅适用于循环,而不适用于
switch
语句.一个continue
内部的switch
一个循环内导致下一个循环迭代.
我对C++不太确定.
它在语法上是正确的,风格上还可以.
好的风格要求每个case:
语句都应该以下列之一结束:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
Run Code Online (Sandbox Code Playgroud)
此外,case (x):
紧接着
case (y):
default:
Run Code Online (Sandbox Code Playgroud)
是允许的 - 捆绑几个具有完全相同效果的案例.
还有什么怀疑是错误的,就像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...
}
Run Code Online (Sandbox Code Playgroud)
...没关系.
尽管从技术上讲是有效的,但所有这些跳跃都模糊了控制流程-尤其是continue
声明。
我会把这种技巧作为最后的手段,而不是第一个。
怎么样
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
Run Code Online (Sandbox Code Playgroud)
它更短,以更清晰的方式显示其内容。