C++ 退出嵌套循环而不转到

C++ 退出嵌套循环而不转到,c++,C++,如何在没有转到的情况下从嵌套的while()或for()退出 例如,如果我在函数中使用如下三个循环: void myfun(){ for (;;) { while( true ) { for (;;) { //what is the exit code of all loop() from here? } } }

如何在没有转到的情况下从嵌套的while()或for()退出

例如,如果我在函数中使用如下三个循环:

   void myfun(){
    for (;;)
    {
        while( true )
        {
            for (;;)
            {

          //what is the exit code of all loop()  from here?
            }
        }
     }
    }
使用
break只能从一个循环中退出,
但如何退出所有循环?

循环可以由计数器限制,也可以不受限制。

不行,您需要在
上下文中再次中断,或者使用变量作为退出标志来更改循环:

      bool exit = false;
      for (;;){
       while (!exit){
            for (;;){
               exit = true; 
               break;
            }
       }
       if (exit) break;
      }

对于代码中有多少个循环,我个人会重写代码,这样一开始就不会有嵌套循环。大概是这样的:

bool myFun2
{
    for (;;)
    {
        if(something) return true;
    }
    // If the loop isn't "forever", return false here?
}


bool myFun1()
{
    while( true )
    {
       if (myFun2()) return true;
    }
    // return false here if needed.
}

void myfun()
{
   for (;;)
   { 
      if(myFun1()) break;
   }
}

这比试图找出某些
exitLoop
变量设置了哪些条件要容易得多,例如。

如果要跳出
函数,即离开该函数,则应使用
return
。但是,如果您只想跳出嵌套循环&而不是跳出函数,则可以
抛出异常。此方法将帮助您避免像某些函数那样将代码分解为多个
函数。然而,
例外
是为库设计者设计的&我们应该避免过多地使用它们。就个人而言,在这种情况下使用
goto
是最好的选择,但正如你反对的那样,因此我这么说。那么您的代码将如下所示:-

void myfun()
{
    try
    {
        for (;;)
    {
        while( true )
        {
            for (;;)
            {
                if (/*some condition*/)
                throw false;
            }
        }
    }
    }
    catch (bool)
    {
        cout<<"caught";
    }
    // do stuffs if your code is successful that is you don't break out
}
void myfun()
{
尝试
{
对于(;;)
{
while(true)
{
对于(;;)
{
如果(/*某些条件*/)
抛假;
}
}
}
}
捕获(bool)
{

可以使用多个
break
和一个
bool
变量来指示条件。尝试
return
而不是为什么不使用
goto
?它非常适合这个问题。@HolyBlackCat:一个原因可能是代码在任何严重的代码复查中都会幸存下来。可能重复的原因是滥用异常mechanism。异常会增加很多开销。@NeilKirk我想,当我们使用从
std::exception
派生的异常类时,开销通常会发生。这是一个简单的抛出
bool
的异常类,所以开销不会很大。@SomeWittyUsername我同意这一点,因此我自己在回答中写道,我不喜欢它这是因为
异常
通常是针对库开发人员的。不要猜测,查找它。异常速度慢,与
std::exception
无关。任何人都可以使用异常,而不仅仅是库开发人员。您也可以使用lambdas。如果内部循环需要访问外部局部变量,这可能会更方便除了非常简单的情况外,我并不特别喜欢lambdas。这主要是因为它们很难调试,因为它们没有(读者显而易见)名称,所以你不能在那里设置断点。但是,是的,可能,@MatstPeterson:为什么你不能在lambdas中设置断点?毕竟,你在源代码中设置断点,而不是在生成的二进制文件中,所以为lambdas生成什么具体名称并不重要。我不知道你使用什么调试器,但没有一个调试器我使用“允许我设置断点”而不是“文件+行号”或“函数名”。这使得lambda很难设置断点,因为它们通常与使用lambda的断点位于同一行,并且没有(用户可用)名称。