可能重复:
Why is it bad to use goto?
GOTO still considered harmful?
我通过xkcd进行了调整并看到了这个(几年前还阅读了一些关于他们的负面文章):
这究竟是什么问题?为什么goto甚至可以在C ++中使用呢?
为什么不使用它们?
答案 0 :(得分:92)
因为它们会导致spaghetti code。
在过去的编程语言中没有while()if()等,程序员使用goto来构成程序的逻辑。这导致了无法维护的混乱。
这就是CS众神创造函数条件和循环的原因。 Structured编程在当时是一场革命。
goto适用于少数几个地方,例如跳出嵌套循环
答案 1 :(得分: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
实现子程序是滥用它的主要方式。这就产生了所谓的“意大利面条代码”,这种代码不必要地难以阅读和维护。
答案 2 :(得分:31)
goto本身没有任何问题。它在编程中是一个非常有用的结构,并且有许多有效的用途。想到的最好的是在C程序中释放结构化资源。
当goto出现问题时,他们会被滥用。滥用gotos可能导致完全不可读和无法维护的代码。
答案 3 :(得分:21)
1968年,Edsger Dijkstra给 ACM通讯 GOTO is considered harmful的编辑写了一封着名的信,其中他用列出了结构化编程的案例。循环和 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 kernel(another source)这是一个惯用C代码的一个很好的例子。)
XKCD漫画是一个关于“如果某些特定的设计模式在使用时受到极大帮助会导致GOTO总是被视为有害的问题”的笑话吗?
答案 4 :(得分:8)
你有问题吗?
反goto运动的创始人是Edsger Dijskstra,他的传奇故事是“Goto Considered Harmful”
为了让你开始,你可以转到(哈哈!)http://en.wikipedia.org/wiki/GOTO
答案 5 :(得分:5)
这在C ++中是可能的,因为它可能在C中。你是否应该使用它是长期的宗教战争。