在C++中从内部循环中跳出外部循环

3
我想问如何在一个内部循环中跳出外部循环。
例子:
while (true) {
    for (int i = 0; i < 2; i++) {
        std::cout << "Say What?";
        // Insert outer-loop break statement here
    }
}

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


9
将所有内容放在一个函数中,并从内部循环中返回。 - jrok
1
使用一个可以检查内/外循环中断的寄存器/整型变量? - ha9u63a7
1
@jrok 或者将内部循环放入一个函数中,并返回由外部循环检查的特定值。 - Some programmer dude
1
while(true){ for(int i = 0; i < 2; i++){ std::cout << "说什么?"; //在此处插入外层循环的break语句 break; } break; } 内部的break将会打破内部循环,然后外部的break将会打破外部循环。 - Ali Kazmi
1
@hagubear "Religious", 确实。为了避免使用Goto而使代码复杂化是一种装神弄鬼的编程方式。 - molbdnilo
显示剩余7条评论
6个回答

7
将您的循环放入函数中,并从函数中返回
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:
//...

您可以使用一个布尔值来“打破它”。此外,您还可以使用布尔值“打破它”
bool bKeepGoing = true;
while (bKeepGoing)
{
    for (int i = 0; i < 2; i++)
    {
        std::cout << "Say What?";
        if (EventOccured)
        {
            bKeepGoing = false;
            break;
        }
    }
}

3
如果您不想将其制作成函数,则可以选择以下选项:
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;
        }
    }
}

2
你可以使用goto语句。但我会这样做。
while(true){
    bool breakMe = false;
    for(int i = 0; i < 2; i++){
        std::cout << "Say What?";

        breakMe = true;
        break;
    }

    if ( breakMe )
        break;
}

我不建议使用goto,因为除非没有其他办法,否则一般都不建议使用它 - 这是良好的编程实践。 - ha9u63a7
1
为什么不直接使用 while (!breakMe),以及在 for 循环的条件中使用 !breakMe && i < 2。除了结束一个 case 语句之外,break 并没有更多的意义,它只是一个过于炫目的 goto 命令。 - James Kanze

2

像其他人所写的那样,使用函数或者更好的是在C++11中使用带有返回值的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'而不是原始循环。


1

Blacktempel提供了更好的方法,但如果您不想使用函数或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;
        }
    }
}

0

你不能直接跳出外层循环。尝试重构代码,使用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”是什么意思? - Ali Kazmi
its not required i mean - Ali Kazmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接