提问人:Chlaus 提问时间:11/12/2023 更新时间:11/14/2023 访问量:74
如何在 C 语言的 if else 语句中从开关内打破 while 循环?
How do I break out of a while loop from within a switch in an if else statement in C?
问:
在学习编程时,我正在尝试有关 if 语句、开关和循环的简单活动,我遇到了这个问题。
while (1) {
if (/*condition*/) {
//error
} else {
switch (num) {
case 1:
break;
default:
//error
}
}
}
显然,该语句仅终止开关块,而不是循环。break;
我试过做
int loop_break = 1;
while ( 1 && loop_break == 1) {
if (/*condition*/) {
//error
} else {
switch (num) {
case 1:
loop_break = 0;
break;
}
}
}
它确实有效,但它真的有效吗?我不认为这适用于所有问题。我正在考虑只使用Goto,但我想先尝试其他方法
答:
3赞
0___________
11/12/2023
#1
是的,这是正确的方法。你不需要.我还建议使用变量名称来显示它们的作用。 宁愿表明你想打破循环,如果它是1 &&
loop_break
true
while (stayInLoop) {
if (/*condition*/) {
//error
} else {
switch (num) {
case 1:
stayInLoop = 0;
break;
}
}
}
如果你有一个非常复杂的断路逻辑,你也可以考虑goto
while (1) {
if (/*condition*/) {
//error
} else {
switch (num) {
case 1:
goto outsideTheLoop;
}
}
}
outsideTheLoop:
评论
2赞
Neil
11/12/2023
+1,尤其是对于从多个点触发的错误,在没有异常机制的情况下,可能会导致代码更具可读性。goto
-1赞
Fe2O3
11/12/2023
#2
"但我想先尝试其他方法"
以下是另一种选择。flag 变量的作用域仅限于循环本身。而且,消除了对额外缩进级别的需要。这是另一种非常可读的方法。trouble
continue
for( int trouble = 0; !trouble; /* */ ) {
if( /*condition*/ ) {
/* error */
continue;
}
switch( num ) {
case 1: trouble++; break;
/* and so on */
}
}
如果你真的很聪明,你可能会看到如何更改为允许执行某种重置,以再次尝试满足......(当然,在 之前递增..)!trouble
trouble < RETRIES
/*error*/
/*condition*/
trouble
continue
0赞
Mark Adler
11/12/2023
#3
或者简单地说:
while (1) {
if (/*condition*/) {
//error
} else {
switch (num) {
case 1:
goto escape;
default:
//error
}
}
}
escape:
;
这是最简单、最有效和最具可读性的方法。
0赞
Lundin
11/14/2023
#4
尽可能简单易读地写出来:
bool loop = false;
while (loop && !error)
{
switch (num)
{
case 1:
loop = false;
break;
...
}
}
if(error)
{
/* handle error */
}
无需将错误处理保留在循环体内。或者,如果错误还不够严重,无法停止循环,那么更具体地说,它会做什么?
也没有必要用goto/continue来召唤各种意大利面条编程。
评论
bool
int