打破; C ++:它实际上正在打破哪个循环

时间:2012-05-14 16:17:20

标签: c++ c loops break

关于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循环。

是这样的吗?

5 个答案:

答案 0 :(得分: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 ++中没有办法让任何其他循环中断目标。为了打破父循环,你需要使用一些其他独立的机制,比如触发结束条件。

此外,如果要退出多个内循环,可以将该循环提取到函数中。在C ++ 11中,可以使用lambda来就地执行它 - 因此不需要使用 goto

答案 1 :(得分:5)

C ++中的break语句将脱离直接放置for的{​​{1}}或switch语句。在这种情况下,它将突破break循环。

C ++中没有办法让for (int j = ...针对任何其他循环。为了打破父循环,你需要使用一些其他独立的机制,比如触发结束条件。

break

答案 2 :(得分:4)

你正在摆脱第二次循环到第一次循环。

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

您可以在顶部设置布尔值

bool shouldBreak = false;

当你写休息时,写下

shouldBreak = true;
break;

然后在循环结束时,每次检查,

if (shouldBreak) break;

答案 3 :(得分:1)

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

您可以在顶部设置布尔值

bool shouldBreak = false;

当你想打破另一个循环时,写下

shouldBreak = true;
break;

答案 4 :(得分:1)

使用break

break将打破它当前所处的重复或迭代循环。这个详细的图像指南旨在强调break的行为,而不是说明良好的编码实践。内部for循环已经足够了,但就像我说的,这是出于视觉目的:

double-iterating-loops

替代建议

使用现代C ++在<algorithm>中提供的各种搜索算法来搜索容器,并在某种程度上搜索字符串。原因有两个:

  1. 更短且更易于阅读代码
  2. 通常和你自己写的任何东西一样快,
  3. 对于较旧的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-loop

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

    老派的C风格for-loop:

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