如何从C中if else语句中的switch中跳出while循环?

yxyvkwin  于 2023-11-16  发布在  其他
关注(0)|答案(4)|浏览(129)

我在学习编程的时候尝试了一些简单的活动,比如if语句、开关和循环,我遇到了这个问题。

while (1) {
    if (/*condition*/) {
           //error
    } else {
           switch (num) {
                 case 1:
                 break;
                 default:
                 //error
           }
    }
}

字符串
显然,break;语句只终止switch块,而不是循环。
我试着

int loop_break = 1;

while ( 1 && loop_break == 1) {
      if (/*condition*/) {
           //error
      } else {
           switch (num) {
                 case 1:
                 loop_break = 0;
                 break;
             }
      }
}


它确实有效,但它真的有效吗?我不认为这将适用于每一个问题。我正在考虑只使用后藤,但我想先尝试其他方法

2izufjch

2izufjch1#

是的,这是正确的方法。你不需要1 &&。我还建议使用变量名,显示它们的作用。如果是trueloop_break将表示你想中断循环

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:

hec6srdp

hec6srdp2#

或者简单地说:

while (1) {
        if (/*condition*/) {
            //error
        } else {
            switch (num) {
            case 1:
                goto escape;
            default:
                //error
            }
        }
    }
  escape:
    ;

字符串
这是最简单、最有效、最易读的方法。

13z8s7eq

13z8s7eq3#

尽量写得简单易懂:

bool loop = false;

while (loop && !error) 
{
  switch (num) 
  {
    case 1:
      loop = false;
      break;
    ...
  }
}

if(error)
{
  /* handle error */    
}

字符串
没有必要在循环体中保留错误处理。或者,如果错误不是真的严重到足以停止循环,那么它会做什么,更具体地说?
也不需要用后藤/continue来变出所有意大利面条式的编程。

tktrz96b

tktrz96b4#

“* 但我想先试试其他方法 *”
下面是一个替代方法。*flag变量 * trouble的作用域仅限于循环本身。而且,continue消除了对额外缩进级别的需要。这是另一个非常可读的方法。

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

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

字符串
如果你真的很聪明,你可能会看到如何改变!troubletrouble < RETRIES将允许/*error*/执行某种 * 重置 *,以再次尝试满足/*condition*/.

相关问题