jrh*_*ath 108 c++ syntax loops break switch-statement
我正在写一些看起来像这样的代码:
while(true) {
switch(msg->state) {
case MSGTYPE: // ...
break;
// ... more stuff ...
case DONE:
break; // **HERE, I want to break out of the loop itself**
}
}
Run Code Online (Sandbox Code Playgroud)
有没有直接的方法呢?
我知道我可以使用一个标志,并通过在切换后放置一个条件中断来从循环中断.我只是想知道C++是否已经有了一些构造.
Meh*_*ari 154
你可以用goto.
while ( ... ) {
switch( ... ) {
case ...:
goto exit_loop;
}
}
exit_loop: ;
Run Code Online (Sandbox Code Playgroud)
Dav*_*vis 53
无论语言或所需功能如何,以下代码都应视为错误形式:
while( true ) {
}
Run Code Online (Sandbox Code Playgroud)
该while( true )循环是拙劣的形式,因为它:
while(true)非无限循环,那么当循环实际上没有终止条件时,我们就失去了简洁通信的能力.(可以说,这已经发生了,所以重点是没有意义.)以下代码是更好的形式:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
Run Code Online (Sandbox Code Playgroud)
没有国旗.不goto.没有例外.容易改变.易于阅读.易于修复.另外代码:
第二点很重要.在不知道代码是如何工作的情况下,如果有人让我做主循环让其他线程(或进程)有一些CPU时间,我会想到两个解决方案:
随便插入暂停:
while( isValidState() ) {
execute();
sleep();
}
Run Code Online (Sandbox Code Playgroud)
覆盖执行:
void execute() {
super->execute();
sleep();
}
Run Code Online (Sandbox Code Playgroud)
此代码比具有嵌入式的循环更简单(因此更易于阅读)switch.该isValidState方法应仅确定循环是否应继续.该方法的主力应被抽象成execute方法,它允许子类覆盖默认行为(一个困难的任务使用嵌入式switch和goto).
对比贴在StackOverflow上的以下答案(对于Python问题):
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
Run Code Online (Sandbox Code Playgroud)
与:
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
Run Code Online (Sandbox Code Playgroud)
在这里,while True导致误导和过于复杂的代码.
sak*_*kra 53
一种替代的解决方案是使用关键字continue结合break,即:
for (;;) {
switch(msg->state) {
case MSGTYPE
// code
continue; // continue with loop
case DONE:
break;
}
break;
}
Run Code Online (Sandbox Code Playgroud)
使用该continue语句完成您希望循环继续的每个案例标签,并使用该break语句完成应终止循环的案例标签.
当然,只有在switch语句之后没有其他代码要执行时,此解决方案才有效.
Alt*_*ife 20
这样做的一种巧妙的方法是将其置于一个函数中:
int yourfunc() {
while(true) {
switch(msg->state) {
case MSGTYPE: // ...
break;
// ... more stuff ...
case DONE:
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
可选(但'不良做法'):如前所述,您可以使用goto,或在交换机内抛出异常.
您可以将您的开关放入一个单独的功能,如下所示:
bool myswitchfunction()
{
switch(msg->state) {
case MSGTYPE: // ...
break;
// ... more stuff ...
case DONE:
return false; // **HERE, I want to break out of the loop itself**
}
return true;
}
while(myswitchfunction())
;
Run Code Online (Sandbox Code Playgroud)
即使你不喜欢goto,也不要使用异常来退出循环.以下示例显示了它有多丑:
try {
while ( ... ) {
switch( ... ) {
case ...:
throw 777; // I'm afraid of goto
}
}
}
catch ( int )
{
}
Run Code Online (Sandbox Code Playgroud)
我会goto像在这个答案中那样使用.在这种情况下,goto将使代码比任何其他选项更清晰.我希望这个问题会有所帮助.
但我认为使用goto是唯一的选择,因为字符串while(true).你应该考虑重构你的循环.我想以下解决方案:
bool end_loop = false;
while ( !end_loop ) {
switch( msg->state ) {
case MSGTYPE: // ...
break;
// ... more stuff ...
case DONE:
end_loop = true; break;
}
}
Run Code Online (Sandbox Code Playgroud)
甚至以下内容:
while ( msg->state != DONE ) {
switch( msg->state ) {
case MSGTYPE: // ...
break;
// ... more stuff ...
}
Run Code Online (Sandbox Code Playgroud)
不,C++ 没有这方面的构造,因为关键字“break”已经被保留用于退出 switch 块。或者,带有退出标志的 do..while() 就足够了。
do {
switch(option){
case 1: ..; break;
...
case n: .. ;break;
default: flag = false; break;
}
} while(flag);
Run Code Online (Sandbox Code Playgroud)