【问题标题】:break in do while loop进入do while循环
【发布时间】:2012-08-26 08:52:59
【问题描述】:

中断嵌套循环会发生什么?

假设以下代码:

for(int x = 0; x < 10; x++)
{
    do {
        if(x == 4)
            break;
        x++;
    } while(x != 1);
}

遇到break语句会退出哪个循环,for循环还是do while循环?

【问题讨论】:

  • break 只会退出内循环
  • 它将退出 do/while,如果你想退出 OUTER 循环,你将不得不使用 goto 语句滚动......
  • 您可以通过多种方式打破外循环。你可以goto,你可以return,你可以设置x = 10;,等等。
  • David,感谢关于将外部循环的条件设置为 false 的提示,但 goto 正是我试图避免的。
  • 通过实际测试此代码,您可以自己回答这个问题。问之前你试过吗?

标签: c loops nested-loops


【解决方案1】:

break 总是会中断最里面的循环。

6.8.6.3

break 语句终止执行最小的封闭语句 switch 或 iteration 语句。


如果您想跳出两个循环,请在for 之后使用标签并使用goto 跳转。

【讨论】:

  • 谢谢,但 goto 正是我试图避免的事情,它有点难看,但这是我的意见。尽管它非常类似于带有分支的程序集中的条件执行。
  • @user1075375 我喜欢 goto。我知道它在 C++ 中是不好的形式,我不会争论。但在 C 中它非常好:-)
  • 在 for 循环中添加一个额外的条件,当你想跳出它时它不会是真的?
  • @teppic 在繁重的循环中这可能不是一个选择。我曾经在硬件上进行过编程,而这些硬件的分支性能非常糟糕。
  • 个人更喜欢if(x == 4) { x = 10; break; }
【解决方案2】:

Break 将终止包含中断的最近/最内层循环。在您的示例中,break 将终止 do-while,并且控制跳回到 for() 循环,并简单地启动 for() 的下一次迭代。

但是,由于您在 do() 和 for() 循环中都修改了 x,因此执行会有些不稳定。一旦外部 X 达到 5,您将产生一个无限循环。

【讨论】:

    【解决方案3】:

    while 将中断,for 循环将继续运行。

    【讨论】:

    • 这就是问题的答案!简单的问题,简单的答案。
    【解决方案4】:

    如果您不想使用goto,也可以使用标志:

    int flag = 0;
    
    for(int x = 0; x < 10; x++)
    {
        do {
            if(x == 4) {
                flag = 1;
                break;
            }
            x++;
        } while(x != 1);
    
    if(flag) 
       break; // To break the for loop
    }
    

    【讨论】:

    • 考虑到缓存中 4 个字节的浪费和循环中额外的条件检查,goto 在性能方面似乎更好。更是如此,因为我希望循环执行很多次。
    • 如果您追求性能,您一开始就不会编写此代码。如果要在达到特定值时中断,则根本不需要外部 for 循环。
    • 这不是我写的代码,只是为了帮助人们理解我的意思。
    • 但这不是问题的答案。
    • @Sany OP 询问如何打破嵌套循环(正如 OP 在他的许多 cmets 中所说的那样,他说“他想避免 goto”)。此外,答案以“替代”开头——这意味着它旨在作为其他答案的补充。您似乎只接受“打破嵌套循环时会发生什么?”并无视问题中的其余描述以及OP的各种cmet。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2018-05-09
    • 2015-07-03
    • 2016-02-21
    • 2020-11-26
    • 2015-02-16
    相关资源
    最近更新 更多