如何在 C 语言的 if else 语句中从开关内打破 while 循环?

How do I break out of a while loop from within a switch in an if else statement in C?

提问人:Chlaus 提问时间:11/12/2023 更新时间:11/14/2023 访问量:74

问:

在学习编程时,我正在尝试有关 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,但我想先尝试其他方法

c if 语句 while-loop switch-statement

评论

2赞 chux - Reinstate Monica 11/12/2023
是的,这可行,但最好的解决方案取决于更大的未发布代码。
2赞 Martin James 11/12/2023
你能把代码放在一个函数中吗?然后,很容易从任何程度的循环/开关嵌套中返回。
0赞 nielsen 11/12/2023
OT:使用 a 来表示 true/false 值,而不是 。例如,请参阅此处:stackoverflow.com/a/75009552/11993121boolint

答:

3赞 0___________ 11/12/2023 #1

是的,这是正确的方法。你不需要.我还建议使用变量名称来显示它们的作用。 宁愿表明你想打破循环,如果它是1 &&loop_breaktrue

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 变量的作用域仅限于循环本身。而且,消除了对额外缩进级别的需要。这是另一种非常可读的方法。troublecontinue

for( int trouble = 0; !trouble; /* */ ) {
    if( /*condition*/ ) {
        /* error */
        continue;
    }

    switch( num ) {
        case 1: trouble++; break;
        /* and so on */
    }
}

如果你真的很聪明,你可能会看到如何更改为允许执行某种重置,以再次尝试满足......(当然,在 之前递增..)!troubletrouble < RETRIES/*error*//*condition*/troublecontinue

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来召唤各种意大利面条编程。