【问题标题】:Breaking out of an outer-loop from inside an inner loop in C++从 C++ 中的内循环内部跳出外循环
【发布时间】:2014-10-27 11:44:28
【问题描述】:

我想问一下,在内部循环中,我将如何突破外部循环。

例子:

while (true) {
    for (int i = 0; i < 2; i++) {
        std::cout << "Say What?";
        // Insert outer-loop break statement here
    }
}

以上只是一些伪代码。不用担心逻辑。

【问题讨论】:

  • 把所有东西都放在一个函数里,然后把return从内部循环中。
  • 使用可以检查是否破坏内部/外部循环的寄存器/int?
  • @Jrok 他可能还不想从函数中返回 :) ?不过也不错
  • 合法使用goto?
  • @jrok 或者将内循环放在一个函数中,并返回一个由外循环检查的特定值。

标签: c++ loops break


【解决方案1】:

将你的循环放入一个函数中,然后返回

void RunMyLoop (...)
{
    while (true)
    {
        for (int i = 0; i < 2; i++)
        {
            std::cout << "Say What?";
            if (SomethingHappened)
                return;
        }
    }
}

可以使用goto

while (bKeepGoing)
{
    for (int i = 0; i < 2; i++)
    {
        std::cout << "Say What?";
        if (EventOccured)
        {
            goto labelEndLoop;
        }
    }
}
labelEndLoop:
//...

您也可以使用 boolean“打破”它。

bool bKeepGoing = true;
while (bKeepGoing)
{
    for (int i = 0; i < 2; i++)
    {
        std::cout << "Say What?";
        if (EventOccured)
        {
            bKeepGoing = false;
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    如果你不想用它做一个功能,这是一个选择:

    bool ok = true;
    while(ok){
        for(int i = 0; i < 2; i++)
        {
            std::cout << "Say What?";
            //insert outer-loop break statement here
            if(/*somthing here*/)
            {
                ok = false;
                break;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      可以使用 goto。但我会这样做。

      while(true){
          bool breakMe = false;
          for(int i = 0; i < 2; i++){
              std::cout << "Say What?";
      
              breakMe = true;
              break;
          }
      
          if ( breakMe )
              break;
      }
      

      【讨论】:

      • 我不建议使用 goto 因为 goto 总是被建议不要使用,直到绝对没有其他工作 - 良好的编程习惯
      • 为什么不简单地使用while (!breakMe)!breakMe &amp;&amp; i &lt; 2 作为for 的条件。除了以case 结尾时,break 只不过是一个美化的goto
      【解决方案4】:

      正如其他人使用函数或在 C++11 中编写的那样,最好使用带有 return 的 lambda。但是如果你必须打破更多不同的嵌套循环,goto 可能是最好的。

      以下伪代码不能用函数实现:

      while (1) {
        // code
        while (1) {
          // code
          while (1) {
            // code
            if (cond1) 
              break one level;
            if (cond2) 
              break two level;
          }
        }
      }
      

      使用 goto 是可能的:

      while (1) {
        // code
        while (1) {
          // code
          while (1) {
            // code
            if (cond1) 
              goto level_a; //break one level;
            if (cond2) 
              goto level_b; // break two level;
          }
          level_a:
        }
        level_b:
      }
      

      重要的是要保持一致。最好使用'algorithm' 并且没有原始循环

      【讨论】:

        【解决方案5】:

        Blacktempel 提供了更好的方法,但如果您不想使用 function 或 goto,请尝试以下操作:

        int break_outer_loop = 0;
        while(break_outer_loop == 0){
            for(int i = 0; i < 2; i++){
                std::cout << "Say What?";
        
                //insert outer-loop break statement here
                if(CONDITION FOR OUTER BREAK) {
                    break_outer_loop = 1;
                    break;
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          你不能直接中断外循环。尝试重构以便可以使用 return,或设置条件以便 while 循环自然结束。

          bool bStop = false;
          
          while(!bStop){
            for(int i = 0; i < 2; i++){
              std::cout << "Say What?";
              bStop = true;
              break; // ends inner loop
             }
          }
          

          void foo(){
            while(true){
              for(int i = 0; i < 2; i++){
                std::cout << "Say What?";
                return;
               }
             }
          }
          

          【讨论】:

          • 这里的 continue 是什么意思?
          • 我的意思是不需要
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-16
          • 2013-12-12
          • 1970-01-01
          • 2011-10-11
          • 2016-12-31
          • 2010-11-28
          • 1970-01-01
          相关资源
          最近更新 更多