在c ++中使用goto的正当理由[重复]

问题描述

||                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

        
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(我认为很难找到这种情况,也许您是根本不使用任何智能指针等),这可能是合法的情况。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...