在delphi中是否有一种情况,GOTO是唯一的解决方案?

时间:2013-09-24 15:18:03

标签: delphi goto

goto声明是我工作中的禁忌 所以出现以下问题......

是否有可能goto是唯一有效的解决方案?

5 个答案:

答案 0 :(得分:6)

  

是否有可能GOTO是唯一有效的解决方案?

我想这取决于你的意思是有效的。我想你问的是,是否存在一个只能使用goto语句编写的程序。在这种情况下,答案是没有这样的程序。无论是否有goto语句,Delphi都是图灵完成的。

但是,如果我们准备扩大讨论范围以包含其他语言,则有些情况goto是一个很好的解决方案,甚至是最佳解决方案。最常见的情况是在没有结构化异常处理的语言中实现整理和错误处理。如果您仔细阅读Linux源代码,您会发现goto被广泛使用。我希望Windows源代码也是如此。

答案 1 :(得分:5)

最初GOTO被添加到Pascal中进行错误处理,包括Borland(/ Embarcadero)从未实现过的程序间形式(例如:从内部过程到父进程的GOTOing),就像Borland从未实现其他内部函数功能一样过程类型参数的函数。(*)

通过这种方式,GOTO可以被视为例外的前兆。

还有一些实际用途:我上次检查时,使用goto跳出嵌套的IF语句在Delphi中仍然更快,然后让代码从嵌套中自然退出。 这些优化有时用于例如:压缩代码,以及其他具有深层嵌套循环或条件语句的复杂树处理代码。

这样的例程通常仍然使用goto进行错误处理,因为它更快。 (异常不仅缓慢,而且它们的边界条件会抑制某些优化)。

可以看出这是Object Pascal的普通Pascal级别的一部分,就像C ++几乎完全允许普通C一样。

(当然,由于Delphi中的优化压缩代码仅以.o形式提供,因此在Delphi代码库中很难找到示例.JPEG代码有一些,但这是C语言翻译)

(*)原始pascal和IIRC甚至Turbo Pascal都不允许过早退出EXIT程序。对于CONTINUE和BREAK也是如此。

答案 2 :(得分:3)

Goto很老了。它早于功能和程序等子程序!这也是非常危险的,并且可以使您的代码不那么可读(对其他人来说,或者几个月后对您自己而言)。

理论上,不可能出现需要goto的情况。我不会在这里重复关于图灵磁带机的理论,但是使用选择和迭代,您可以重新排序代码,以便在所有可能的输入值中产生相同的输出。

在实践中,有时候“方便”和“更好的可读性”可以在某些条件下从代码流中“跳出”,这就是异常进入的地方。raise脱离了当前的执行,并跳转到最近的finallyexcept部分。这更安全,因为它们是级联工作,并且在这些边界条件之一的情况下提供更好的方法来处理上下文。 (此外还有breakabort以及exit

答案 3 :(得分:3)

15年前的一些事情我在Delphi中使用goto语句将one of Bob Jenkins's hash functions从C转换为Pascal。在每种情况下,C函数都有一个switch()语句没有中断,你不能用Pascal的case语句来做。所以我把它转换成了一堆Pascal标签和gotos。我猜你仍然需要用最新的Delphi版本来做同样的事情。 编辑:我想使用gotos仍然是一个合理的方法来做到这一点。获得完成的工作,易于理解,仅限于一小段代码,并非危险。

答案 4 :(得分:2)

GOTO永远不是必需的。任何可计算的算法都可以用赋值和IF ... THENBEGIN ... END和您WHILE的选择来表达。 .. DO ... ENDREPEAT ... UNTIL。你甚至不需要子程序。 :)

这被称为结构化程序定理。

有关证明,请参阅CorradoBöhm和Giuseppe Jacopini撰写的1966年论文Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules (PDF)