每个人都知道Dijkstra的给编辑的信:转到被认为有害的声明(还有在这里 .html和在这里 .pdf),从那时起就有一种强大的推动力,尽可能地避免goto语句。虽然可以使用goto来生成不可维护的、庞大的代码,但它仍然保留在现代编程语言中。即使Scheme中先进的延续控制结构也可以被描述为一个复杂的goto。
在什么情况下需要使用goto?什么时候最好避免?
作为一个后续问题:C提供了一对函数setjmp()和longjmp(),它们不仅提供了在当前堆栈帧内进行跳转的能力,还提供了在任何调用帧内进行跳转的能力。这些应该被认为和goto一样危险吗?更危险?
Dijkstra自己也对这个头衔感到后悔,因为这不是他的责任。在EWD1308(也是在这里 .pdf)的结尾,他写道:
最后讲一个小故事。 1968年,ACM通讯 发表了我的一篇文章 title "考虑的goto语句 有害的" 最常被引用的, 然而,遗憾的是,往往是作者 谁只看到过它 标题,这成为基石 我的名声成为了一个模板:我们 能看到下面各种各样的文章吗 标题“X被认为有害”;为 几乎任何X,包括一个名为 “Dijkstra认为是有害的”。但 发生了什么事?我提交了一份 这篇论文的标题是“强有力的” goto语句" 为了加快其出版速度, 编辑已经改成了“写给” “编辑”,在这个过程中 给了他自己一个新头衔 发明!编辑是尼克劳斯 Wirth . < / p >
关于这个主题的一篇经过深思熟虑的经典论文,与Dijkstra的论文相匹配,是Donald E. Knuth的带有go to语句的结构化编程。阅读既有助于重建上下文,也有助于对主题的非教条性理解。在本文中,Dijkstra对这个案例的观点被报道,并且更加强烈:
Donald E. Knuth:我相信通过呈现这样一个 事实上,我并不是不同意 Dijkstra的观点,因为 他最近写道: 请不要落入……的圈套 相信我是可怕的 教条的关于[去]的教条的 声明)。我有不舒服的感觉 感觉别人在做 宗教出来了,好像 编程的概念问题 只用一个小技巧就能解决,用什么 "