每个人都知道 Dijkstra给编辑的信:go to 被认为有害的语句(也在这里.html 成绩单和这里.pdf),并且从那时起一直在大力推动尽可能避开 goto 语句。虽然可以使用 goto 生成无法维护的庞大代码,但它仍然存在于现代编程语言中。即使是 Scheme 中高级的延续控制结构,也可以说是复杂的 goto。
什么情况下需要使用 goto?什么时候最好避免?
作为后续问题:C 提供了一对函数 setjmp() 和 longjmp(),它们不仅可以在当前堆栈帧内,而且可以在任何调用帧内进行跳转。这些是否应该被视为与 goto 一样危险?更危险?
Dijkstra 本人对这个头衔感到遗憾,他不对此负责。在EWD1308(也在这里.pdf)的结尾,他写道:
最后写一个短篇记录。1968 年,ACM 通讯发表了我的一篇题为“被认为有害的 goto 语句”的文本,在后来的几年里,它被最常引用,但遗憾的是,经常被那些只看过它的作者引用。标题,通过成为模板成为我成名的基石:对于几乎任何 X,我们都会看到标题为“X 被认为有害”的各种文章,包括标题为“Dijkstra 被认为有害”的文章。但是发生了什么?我已经提交了一篇题为“反对 goto 语句的案例”的论文”,为了加快出版速度,主编改成了“致主编的信”,并在此过程中给了它一个自己发明的新标题!主编是尼克劳斯·沃斯。
关于这个主题的一篇经过深思熟虑的经典论文,与 Dijkstra 的论文相匹配,是Donald E. Knuth的Structured Programming with go to Statements 。阅读都有助于重建上下文和对主题的非教条式理解。在这篇论文中,Dijkstra 对这个案例的看法被报道并且更加强烈:
Donald E. Knuth:我相信,通过提出这样的观点,我实际上并没有强烈反对 Dijkstra 的想法,因为他最近写道:“请不要陷入相信我对 [the go to statement]。我有一种不舒服的感觉,其他人正在把它变成一种宗教,好像编程的概念问题可以通过一个技巧,通过一种简单的编码纪律形式来解决! ”