问题描述
||
这个问题已经在这里有了答案:
解决方法
goto
是处理此问题的一种优雅而有效的方法:
for (...) {
for (...) {
for (...) {
/* detect condition that requires breaking all three loops */
}
}
}
out:
另一个例子。假设您有一个强大的功能-2K线。不用惊讶,很多网络代码都带有此功能。并且在函数中,在不同的时间,您会检测到需要相同错误处理的条件:goto
亮起。
编辑下面的链接,其中包含与Dijkstra的文章相反的原始文章的一部分。
“GOTO
陈述被认为有害”被认为有害
, 当您需要突破一个深层嵌套的循环时。假设您要在3维矩阵中搜索值:
for( size_t i = 0; i != d0; ++i )
for( size_t j = 0; j != d1; ++j )
for( size_t k = 0; k != d2; ++k )
if( m[i][j][k] == key )
{
// break out
}
当然,您总是可以定义一个函数,然后定义一个return
,但是您可能有一次用例,其中写一个函数(因此将代码移出上下文,携带所有变量,等等)是不值得的。只是为了避免使用goto
的麻烦。
, 您可以使用goto
进行清理,例如:
void doSomething()
{
if (someCondition)
goto cleanUPA;
if (otherCondition)
goto cleanUPB;
if (oneMoreCondition)
goto cleanUPAll;
//All good then just
return;
cleanupUPB:
//respective cleanups
cleanupUPA:
//respective cleanups
cleanUPALL:
//respective cleanups
}
可能可以通过在C ++中使用RAII来实现更好的方式,但是通常来自C背景,因此通常使用goto
,因此,由于某种原因,您不能使用RAII(我认为很难找到这种情况,也许您是根本不使用任何智能指针等),这可能是合法的情况。