如何使用“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语句?
答案 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 );
但是,它可以在任何需要此功能的地方重复使用。