使用goto有什么问题? [重复]

问题描述 投票:92回答:6

可能重复: Why is it bad to use goto? GOTO still considered harmful?

我通过xkcd进行了调整,看到了这个(几年前还读了一些关于它们的负面文章): 这究竟是什么问题?为什么goto甚至可以在C ++中使用呢?

我为什么不用它们?

c++ goto
6个回答
92
投票

因为他们导致spaghetti code

在过去,编程语言没有while()if()等,程序员使用goto来构成程序的逻辑。它导致了一个难以维护的混乱局面。

这就是CS众神创造函数条件和循环的原因。 Structured编程在当时是一场革命。

goto适用于少数几个地方,例如跳出嵌套循环


51
投票

如果使用得当,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:

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

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


31
投票

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

当goto出现问题时,他们会被滥用。滥用gotos可能导致完全不可读和无法维护的代码。


21
投票

1968年,Edsger Dijkstra给ACM GOTO is considered harmful的通讯编辑写了一封着名的信,他在其中列出了使用while循环和if ...... then ... else条件的结构化编程的案例。当GOTO用于替代这些控制结构时,结果通常是spaghetti code。几乎每种使用的编程语言都是结构化编程语言,并且几乎消除了GOTO的使用。实际上,Java,Scala,Ruby和Python根本没有goto命令。

C,C ++和Perl仍然有一个GOTO命令,并且有些情况(特别是在C中)有一个GOTO is useful,例如一个退出多个循环的break语句,或者作为一种方法将清理代码集中在一个函数的单个位置即使有多种方法来终止该功能(例如,通过在函数的进程中的多个点返回错误代码)。但一般来说,它的使用应限于以受控和公认的方式要求它的特定设计模式。

(在C ++中,最好使用RAII或ScopeGuard (more)而不是使用GOTO进行清理。但GOTO是一个frequently used idiom in the Linux kernelanother source),它是惯用C代码的一个很好的例子。)

XKCD漫画是一个关于“如果某些特定的设计模式在使用时受到极大帮助,GOTO总是被视为有害的问题”的笑话吗?


8
投票

你有问题吗?

反goto运动的创始人是Edsger Dijkstra和他的传奇“Goto Considered Harmful”

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


5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.