break; 在C++中到底是跳出哪个循环?

13

关于C++代码的简单问题:

for(int i=0;i<npts;i++)
{
    for(int j=i;j<2*ndim;j++)
    {
        if(funcEvals[i]<bestListEval[j])
        {
            bestListEval[j] = funcEvals[i];
            for(int k=0;k<m_ndim;k++)
                bestList[j][k] = simplex[i][k]; 
            break; 
        }
    }
}

我希望确保:

  • double **simplex的每一行最多只插入double **bestList一次。
  • 这里的break会跳出第二个(内部)for循环。

是这样吗?


是的,它正在跳出第二个for循环。 - Seth Carnegie
4
break总是跳出当前代码中最内层的结构(循环或switch),在这种情况下是for (j ...循环。 - Jerry Coffin
3
break总是会打破最内层的循环。如果你想跳出多个循环,你需要拥有一个布尔变量或者其他类似的东西来追踪何时继续或停止。 - N_A
1
如果 funcEvals[i]<bestListEval[j]true,则 break 语句将始终发生。你真的应该使用一些更好的变量名。 - Security Hound
由于问题与C语言相关且代码是用C语言编写的,因此添加了“C”标签。 - Sergey K.
5个回答

32

C++中的break语句会跳出直接放置在其中的for或switch语句。它会中断最内层的结构(循环或开关)。即:

    for(int i=0;i<npts;i++)
    {
        for(int j=i;j<2*ndim;j++)
        {
            if(funcEvals[i]<bestListEval[j])
            {
                bestListEval[j] = funcEvals[i];
                for(int k=0;k<m_ndim;k++)
                    bestList[j][k] = simplex[i][k]; 
                break; 
            }
        }
        // after the 'break' you will end up here
    }

在C++中,没有办法让break跳出其他循环。如果你想要跳出父级循环,你需要使用其他独立的机制来触发结束条件。

另外,如果你想要退出多个内部循环,你可以将这些循环提取到一个函数中。在C++11中,可以使用lambda表达式直接进行操作 - 所以就不需要使用goto了。


3
标签和goto通常可用于跳出其他循环。 - edA-qa mort-ora-y
5
我通常会把这种东西放在一个名为 findFirstElemThatXYZ 的函数中,当我找到它时就返回。 - Dennis

5
在C++中,break语句将会跳出直接包含该语句的forswitch语句。在这种情况下,它将跳出for (int j = ...循环。
在C++中没有其他方法能够使break针对其他循环。为了跳出父级循环,您需要使用一些独立的机制,例如触发终止条件。请注意不要修改原有的html标签。
// Causes the next iteration of the 'for (int i ...' loop to end the loop)
i = npts;

// Ends the 'for (int j ...' loop
break;

1
不要忘记goto、异常和longjmp :) - sehe
将设置i = npts来中断循环的做法容易让人困惑,建议使用布尔值代替。 - Mooing Duck
1
@MooingDuck 我的示例旨在对 OP 的示例干扰最少。 - JaredPar

3
你正在从第二层循环中跳出到第一层循环。
for (int i=0; i<npts; i++)

您可以在顶部设置一个布尔值。
bool shouldBreak = false;

当你写break时,要写成

shouldBreak = true;
break;

然后在您的循环结束时,每次检查:
if (shouldBreak) break;

0

使用 break

break 用于跳出当前所在的循环语句。这个详细的图片指南旨在强调 break 的行为,而不是展示好的编码实践。内部的 for 循环本身已经足够了,但正如我所说,这是为了视觉效果:

double-iterating-loops

备选建议

使用现代C++中的各种搜索算法,这些算法可以在<algorithm>中找到,用于搜索容器和在某种程度上搜索字符串。这样做的原因有两个:

  1. 代码更短,更易读
  2. 通常与您自己编写的任何内容一样快,甚至更快

这些代码示例将需要相同的样板文件,除了旧的for循环搜索需要使用<algorithm>

#include <vector>
#include <algorithm>

std::vector<int> int_container = { 10, 23, 10345, 432, 2356, 999, 1234, 0x45f };
bool has1234 = false;

现代的方式可能是这样的,我们快速地搜索容器,如果搜索迭代器没有到达容器的末尾(不是最后一个元素),我们就知道它正在查找的值已经被定位了
这段代码用更少的行数和更少的潜在故障点实现了相同的结果,与下面的旧方法相比,用户编写的代码也更加简洁。

现代 C++ 风格

auto search_position = std::find( int_container.begin(), int_container.end(), 1234 ) ;
if ( search_position != int_container.end() )
    has1234 = true;

C++11 基于范围的 for 循环

for ( auto i : int_container )
{
    if ( i == 1234 )
    {
        has1234 = true;
        break;
    }
}

传统的 C 风格 for 循环:

for ( int i = 0; i < int_container.size(); i++ )
{
    if ( int_container[i] == 1234 )
    {
        has1234 = true;
        break;
    }
}

0
for (int i = 0; i < npts; i++)

你可以在顶部设置一个布尔值。
bool shouldBreak = false;

当你想要退出另一个循环时,写入

shouldBreak = true;
break;

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