此问题在此处已有答案:
13年前就关门了
可能重复:
Why is it bad to use goto?
GOTO still considered harmful?的
我正在浏览xkcd,看到了这一条(如果几年前也读过一些关于他们的负面文章):
的数据
它到底有什么问题?为什么后藤在C++中是可能的?
为什么我不能用它们?
此问题在此处已有答案:
13年前就关门了
可能重复:
Why is it bad to use goto?
GOTO still considered harmful?的
我正在浏览xkcd,看到了这一条(如果几年前也读过一些关于他们的负面文章):
的数据
它到底有什么问题?为什么后藤在C++中是可能的?
为什么我不能用它们?
6条答案
按热度按时间rmbxnbpk1#
因为它们指向spaghetti code。
在过去,编程语言没有while循环、if语句等,程序员使用后藤来构建程序的逻辑,这导致了不可维护的混乱。
这就是为什么CS之神创造了方法、条件和循环。Structured编程在当时是一场革命。
goto在一些地方是合适的,比如跳出嵌套循环。
lfapxunr2#
如果使用得当,
goto
没有什么问题。它之所以是“禁忌”,是因为在C语言的早期,程序员(通常来自汇编背景)会使用goto
创建令人难以置信的难以理解的代码。大多数情况下,没有
goto
也可以过得很好。然而,也有一些情况下,goto
可以很有用。最好的例子是这样的情况:字符串
使用
goto
跳出深度嵌套的循环通常比使用条件变量并在每个级别上检查它更干净。使用
goto
实现子程序是它被滥用的主要方式,这会产生所谓的“意大利面条代码”,不必要地难以阅读和维护。llycmphe3#
goto
本身没有什么问题。它是编程中非常有用的结构,有许多有效的用途。最好的是在C程序中释放结构化资源。goto
出错的地方是它被滥用的时候。滥用goto
会导致完全不可读和不可维护的代码。2hh7jdfx4#
1968年,Edsger Dijkstra给 Communications of the ACMGOTO is considered harmful的编辑写了一封著名的信,他在信中提出了使用while循环和if. then. else条件进行结构化编程的情况。当使用后藤来替代这些控制结构时,结果通常是spaghetti code。几乎所有的编程语言都是结构化编程语言,GOTO的使用几乎已经被淘汰。事实上,Java,Scala,Ruby,而Python根本没有
goto
命令。C、C和Perl仍然有一个后藤命令,(特别是在C中)其中GOTO is useful,例如退出多个循环的break语句,或者作为一种将清理代码集中在函数中的单个位置的方式,即使有多种方式来终止函数(例如,通过在函数执行过程中的多个点返回错误代码)。但一般来说,它的使用应限于特定的设计模式,这些设计模式以受控和可识别的方式调用它。
(In在C中,最好使用RAII或ScopeGuard(more),而不是使用后藤进行清理。但后藤是frequently used idiom in the Linux kernel(another source),这是惯用C代码的一个很好的例子。)
XKCD漫画是一个关于这个问题的笑话:“当某些特定的设计模式被使用时,后藤应该总是被认为是有害的吗?”
polhcujo5#
你google了这个问题吗?
反Goto运动的创始人是Edsger Dijskstra,他的传奇“Goto被认为是有害的”
为了让你开始,你可以后藤(哈哈!)http://en.wikipedia.org/wiki/GOTO
ecbunoof6#
它在C中是可能的,因为它在C中是可能的。你是否应该使用它是长期存在的宗教战争。
C的一个设计目标是,99%左右的C程序应该在C++中编译和运行,包括
goto
是实现这一目标的努力的一部分。