6

如何使用“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;
            }
        }
    }

当我离开嵌套的 for 循环时,我想保留 i 和 j 的值。我该如何使用 goto 语句呢?

4

4 回答 4

12

像这样:

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;
于 2012-09-27T00:49:11.193 回答
6

就像您goto在任何其他情况下使用一样。只要您不跨越其中包含局部变量的作用域,您实际上可以将其视为“转到这一行和那一行”:

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

但是,在很多情况下,goto是不是设计良好的代码的指标。绝不总是,但经常。

我建议你使用gotos big Brotherreturn并将你的代码分解为一个函数:

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
}
于 2012-09-27T00:49:38.743 回答
2

好吧,@bitmask 的回答已经说出了我在阅读问题时想说的大部分内容。

但为了完整起见,这里有另一种技术:

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 );

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

于 2012-09-27T02:06:54.743 回答
1

您不需要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;
    }
}
于 2012-09-27T00:48:40.897 回答