每个人都知道Dijkstra写给编辑的信:转到被认为是有害的声明(也在此处是 .html成绩单和此处 .pdf),并且自那时以来一直在大力推动以尽可能避免使用goto声明。尽管可以使用goto生成无法维护的庞大代码,但仍保留在现代编程语言中。甚至Scheme中的高级连续控制结构也可以描述为复杂的goto。
什么情况下需要使用goto?什么时候最好避免?
作为后续问题:C提供了一对函数setjmp和longjmp,它们不仅可以在当前堆栈帧中而且可以在任何调用帧中转到。这些应该像goto一样危险吗?更危险吗?
迪克斯特拉本人对此感到遗憾,对此他不负责。在EWD1308的末尾(也在此处 .pdf),他写道:
最后是一个短故事,供记录。1968年,ACM通讯发布了我的文本,标题为“ goto声明被认为是有害的 ”,在后来的几年中,我的文本经常被引用,但是遗憾的是,经常看到这些文本的作者对此一无所知。标题,通过成为模板,成为了我成名的基石:我们几乎可以在X上看到标题为“ X认为有害”的各种文章,其中包括标题为“ Dijkstra认为有害”的文章。但是发生了什么事?我已经提交了标题为“ 反对goto陈述的案例 ”的论文为了加快出版速度,编辑将其更改为“编辑的信”,并在此过程中为其赋予了自己的发明的新标题!编辑是Niklaus Wirth。
与Dijkstra相匹配的,经过深思熟虑的经典论文是Donald E. Knuth撰写的结构化编程与go to语句。阅读既有助于重新建立上下文,也有助于对主题的非教条式理解。在本文中,Dijkstra对于此案的观点得到了报道,并且更加有力:
唐纳德·E·努斯(Donald E. Knuth):我相信提出这种观点实际上并不与迪杰斯特拉的想法完全不同意,因为他最近写了以下文章:“请不要陷入相信我对[去发言。我有不舒服的感觉,其他人正在一个宗教出来,仿佛编程的概念问题可以通过一个单一的技巧来解决,通过编码规则的简单形式! “
goto
。