为什么和何时在C / C ++中使用goto?

wol*_*ajr 2 c c++ goto

我知道很多问题,例如为什么不使用goto,为什么goto不好用,为什么是goto由恶魔创造的,为什么goto要敲打打字者的手指等?

对这个问题这个问题甚至在Wikipedia许多答案中都有可能找到赞成或反对的理由goto

甚至Stackoverflow也有一个goto标签:)

但是,显然,它goto被接受为有效命令,否则您的编译器/解释器将不知道如何处理它。即使在C / C ++中,也可以使用goto,并且该语言甚至具有正式的ISO规范。

因此,大概在某些情况下,只有通过使用goto它才能完成某些任务。那么,为什么以及何时goto在C / C ++中使用a ?

编辑:

只想确认一下:

1-这个问题不需要辩论。应该是负责任的:给出一个或多个goto唯一解决方案的情况,或说明no, it's always possible to avoid a goto。当然,我不是唯一可以决定是否关闭它的人,但是我不认为“范围太广,要求辩论等”是关闭它的理由。

2-在某些情况下,goto可以使代码更整洁,更快等。我不希望如此。我想知道是否存在goto唯一的解决方案(不,这不是“给出goto的好例子”问题的重复)

3-如果有正当理由,我将接受任何不赞成票,脸上带着微笑。但是我很确定这个问题已经解决了,并且已经对该主题进行了先前的研究。拒绝投票很简单,因为使用了以“ G”开头的4字母禁忌词...对不起...

Jim*_*ion 5

最新的 MISRA 标准现在允许 goto。

goto 有意义的一个很好的例子是当你有一个包含很多退出点的大型例程时。您可以有许多 return 语句(不好)使用“结构化编程”条件(也不好)或“goto Done;它在返回之前将程序发送到一组结束语句”对代码进行卷积。

MISRA 标准基本上允许在这些情况下使用 goto。我认为“仅向下”是他们的标准之一。

  • @jrok:通常当您有一大块清理代码时,如果您使用多个返回,这些代码将被重复。 (4认同)
  • 你调用 MISRA 就像它是某种控制所有编程的圣经。 (2认同)

Cha*_*rns 5

我使用 goto 的唯一原因是当它用于需要一些常见清理的函数的错误返回条件时。goto 的目标位于函数末尾附近,并且“正常”返回在标签之前返回。

  • 是的!如果您在返回之前需要进行任何最终处理,您可以将其全部放在一个地方。代码中的许多“goto Done”并不令人困惑或混乱,因为很清楚发生了什么。 (3认同)

Emm*_*met 5

在任何情况下都没有goto绝对必要的a:如果您确实愿意,可以始终避免使用a,但是仅出于思想上的原因这样做是错误的。

例如,我的一个朋友编写了一个具有15个嵌套循环的小波变换函数。如果这些循环中发生错误,他将goto在函数的return语句之前进入清除块。为了在没有 goto的情况下达到相同的效果,需要设置一个标志并在每个循环级别对其进行测试,这会使他的代码可读性差得多。在这种情况下,goto是正确的选择。

  • 我很满意我的回答,谢谢。 (3认同)
  • 告诉您的朋友 15 个嵌套循环太多了……大约 13 个。 (2认同)
  • 这些情况不存在,因为这种语言是图灵完整的,没有goto构造。因此,唯一合理的答案,恕我直言,是要陈述这一事实,并给出一个示例,说明即使可以避免它也是优选的,这正是我所做的。如果您的观点与所讨论的实质性问题有关,而不是对无关紧要的内容a之以鼻,那么您的评论并不能很好地传达这一点。 (2认同)