如何使用goto打破嵌套循环

时间:2012-09-27 00:44:04

标签: c++ for-loop goto

如何使用“goto”语句来摆脱循环

for(i = 0; (i < 9); i++)
    {
        for(j = 0; j < 9; j++)
        {
            //cout << " " << Matrix[i][j];
            //cout << "i: " << i << endl;
            if(Matrix[i][j] == 0)
            {
                //temp = 10;
                [goto] ;
                //break;
            }
        }
    }

我想保留i和j离开嵌套for循环时的值。我怎样才能使用goto语句?

4 个答案:

答案 0 :(得分:9)

像这样:

int i,j;
for(i = 0; i < 9; i++)
{
    for(j = 0; j < 9; j++)
    {
        //cout << " " << Matrix[i][j];
        //cout << "i: " << i << endl;
        if(Matrix[i][j] == 0)
        {
            //temp = 10;
            goto end;
            //break;
        }
    }
}
end:
cout << i << " " << j << endl;

答案 1 :(得分:5)

就像在任何其他情况下使用goto一样。只要您不将范围与其中的局部变量交叉,您实际上可以将其视为“转到此行和那行”:

for (/* ... */) {
  /* ... */
  if (/* ... */)
    goto finalise;
}
finalise:
  foo = bar; //...

但是,在goto是未设计良好代码的指标时,有很多情况。决不是总是,而是经常。

我建议您使用goto的大哥return并将您的代码分解为函数:

inline std::pair<int,int> findZeroEntry(std::vector matrix) {
  for (int i = 0; i < 9; i++)
    for (int j = 0; j < 9; j++)
      if (Matrix[i][j] == 0)
        return std::make_pair(i,j);
  return std::make_pair(9,9); // error
}

答案 2 :(得分:2)

您不需要goto离开嵌套for循环并保存这些变量。仅仅是,你想要连续突破每个循环。只需在适当的范围级别有一个布尔值,您可以检查是否需要突破循环。

已更正示例

IE:

bool HasFoundZero = false;
for(i = 0; i < 9; i++)
{
    for(j = 0; j < 9; j++)
    {
        //cout << " " << Matrix[i][j];
        //cout << "i: " << i << endl;
        if(Matrix[i][j] == 0)
        {
            //temp = 10;
                HasFoundZero = true;
        }
        if(HasFoundZero)
        {
            break;
        }
    }
    if(HasFoundZero)
    {
        break;
    }
}

答案 3 :(得分:2)

嗯,@bitmask's answer已经说过我在阅读这个问题时所说的大部分内容。

但为了完整性,这是另一种技术:

Matrix              m;
Index2D< 9, 9 >     pos;

for( ; pos < pos.end();  ++pos )
{
    if( m( pos.x(), pos.y() ) == 0 )
    {
        break;
    }
}
cout << pos.x() << " " << pos.y() << endl;

恕我直言,这是更清晰的代码。

此外,可以使矩阵支持通过Index2D值进行索引,从而将上述内容简化为......

Matrix              m;
Index2D< 9, 9 >     pos;

for( ; pos < pos.end();  ++pos )
{
    if( m[pos] == 0 )
    {
        break;
    }
}
cout << pos.x() << " " << pos.y() << endl;

由于标准库中没有Index2D,因此需要在某处定义,例如像

template< int width, int height >
struct Index2D
{
    int         i_;

    int x() const { return i_ % width; }
    int y() const { return i_ / width; }

    void operator++() { ++i_; }

    bool operator<( Index2D const& other ) const
    {
        return (i_ < other.i_);
    }

    Index2D(): i_( 0 ) {}

    Index2D( int const x, int const y )
        : i_( width*y + x )
    {}

    static const Index2D endValue;
    static Index2D end() { return endValue; }
};

template< int width, int height >
Index2D< width, height > const Index2D< width, height >::endValue( 0, height );

但是,它可以在任何需要此功能的地方重复使用。