5

我知道很多关于为什么不使用的问题goto,为什么goto是不好的做法,为什么goto是魔鬼创造的,为什么打字的人的手指goto应该被扯掉等等......

在这个问题的许多答案中这个问题,甚至在维基百科上,都可以找到赞成/反对的理由goto

甚至 Stackoverflow 也有goto标签 :)

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

所以,可能,应该有一些情况,只有通过使用goto它才有可能完成一些任务。那么,为什么以及何时应该goto在 C / C++ 中使用 a ?

编辑:

只想确认一下:

1 - 这个问题不需要辩论。它应该是可回答的:给出一个或多个案例 wheregoto是唯一的解决方案,或者说明no, it's always possible to avoid a goto. 当然,我不是唯一可以决定是否关闭的人,但我不认为“太宽泛、要求辩论等”是关闭它的理由。

2 - 在某些情况下,可能goto会使代码更清晰、更快等。我不想要这些。我想知道是否存在goto唯一解决方案的情况(不,这不是“给出 goto 的好例子”问题的重复)

3 - 如果反对票是合理的,我会面带微笑接受任何反对票。但我很确定这个问题有答案,并且之前已经对该主题进行过研究。投反对票很简单,因为使用了那些以“G”开头的 4 个字母的禁忌词......对不起......

4

4 回答 4

10

没有任何情况下 agoto是绝对必要的:如果你真的想要,你总是可以避免它,但出于纯粹的思想原因这样做是错误的。

例如,我的一个朋友写了一个小波变换函数,它有(类似的)15 个嵌套循环。如果这些循环中出现错误,他在函数语句goto之前有一个清理块。要在没有returngoto 的情况下达到相同的效果,需要设置一个标志并在每个循环级别对其进行测试,这会使他的代码的可读性大大降低。在这种情况下,是正确的选择。goto

于 2013-08-29T18:52:54.007 回答
6

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

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

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

于 2013-08-29T18:42:43.087 回答
5

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

于 2013-08-29T18:44:24.623 回答
3

这是一个只有 goto 可以工作的例子: https ://stackoverflow.com/a/245801/193848

基本上,如果您有多个嵌套for循环,则从内部循环中跳出所有循环的唯一方法是使用goto语句(因为与其他一些语言不同,Cbreak关键字不支持用于中断的嵌套级别数的参数)。

于 2013-08-29T18:48:12.467 回答