195

可能的重复:
为什么使用 goto 不好?
GOTO 仍然被认为是有害的?

我正在通过 xkcd 随机浏览并看到了这个(如果几年前还阅读了一些关于它们的负面文本):
你的慢速连接很糟糕,找一个更快的来看看这张图片
它实际上有什么问题?那么为什么 goto 在 C++ 中甚至是可能的呢?

为什么我应该使用它们?

4

6 回答 6

147

因为它们导致了意大利面条代码

过去,编程语言没有while循环、if语句等,程序员使用goto来组成程序逻辑。它会导致无法维护的混乱。

这就是 CS 之神创造方法、条件和循环的原因。结构化编程在当时是一场革命。

goto 在一些地方是合适的,例如跳出嵌套循环。

于 2010-08-19T00:10:14.410 回答
94

goto如果使用得当,没有什么问题。它之所以成为“禁忌”是因为在 C 语言的早期,程序员(通常来自汇编背景)会使用它goto来创建难以置信的难以理解的代码。

大多数时候,你可以没有生活goto并且过得很好。但是,在某些情况下goto可能有用。主要的例子是这样的情况:

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
            ...
            if (condition)
                goto break_out;
            ....
        }
    }
}
break_out:

使用 agoto跳出深度嵌套的循环通常比使用条件变量并在每个级别上检查它更干净。

用于goto实现子程序是它被滥用的主要方式。这会产生所谓的“意大利面条式代码”,它不必要地难以阅读和维护。

于 2010-08-19T00:14:06.290 回答
43

goto 本身没有任何问题。它在编程中是一个非常有用的结构,并且有许多有效的用途。想到的最好的方法是 C 程序中的结构化资源释放。

goto 出错的地方是当他们被滥用时。滥用 goto 会导致代码完全不可读和不可维护。

于 2010-08-19T00:08:55.413 回答
31

1968 年,Edsger Dijkstra写了一封著名的信给ACM GOTO 被认为有害的通讯编辑,他在信中阐述了使用while 循环if...then...else条件进行结构化编程的案例。当使用 GOTO 替代这些控制结构时,结果往往是意大利面条式代码。当今使用的几乎所有编程语言都是结构化编程语言,而 GOTO 的使用几乎已被淘汰。事实上,Java、Scala、Ruby 和 Python 根本没有goto命令。

C、C++ 和 Perl 仍然有 GOTO 命令,并且在某些情况下(尤其是在 C 中)GOTO 很有用,例如退出多个循环的 break 语句,或者作为将清理代码集中在一个地方的一种方式即使有多种方法可以终止函数(例如,通过在函数执行过程中的多个点返回错误代码),函数也是如此。但一般来说,它的使用应仅限于特定的设计模式,这些模式以受控和认可的方式需要它。

(在 C++ 中,最好使用 RAII 或ScopeGuard (更多)而不是使用 GOTO 进行清理。但是 GOTO 是Linux 内核(另一个来源)中经常使用的习惯用法,这是习惯 C 代码的一个很好的例子。)

XKCD 漫画是一个关于“当某些特定的设计模式因其使用而得到极大帮助时,是否应该始终认为 GOTO 是有害的?”这个问题的笑话?

于 2010-08-19T00:13:56.037 回答
10

你用谷歌搜索过这个问题吗?

反 goto 运动的创始人是 Edsger Dijskstra,他的传奇“Goto 被认为是有害的”

为了让您开始,您可以转到(哈哈!)http://en.wikipedia.org/wiki/GOTO

于 2010-08-19T00:09:33.773 回答
9

它在 C++ 中是可能的,因为它在 C 中是可能的。你是否应该使用它是长期的宗教战争。

C++ 的设计目标是 99% 左右的 C 程序应该在 C++ 中以相同的功能编译和运行。包括goto是实现这一目标的努力的一部分。

于 2010-08-19T00:08:55.837 回答