Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphi中是否存在GOTO是唯一解决方案的情况?_Delphi_Goto - Fatal编程技术网

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

delphi中是否存在GOTO是唯一解决方案的情况?,delphi,goto,Delphi,Goto,goto语句是我工作中的禁忌。 所以下面的问题就诞生了 是否有一种情况下,goto是唯一有效的解决方案 是否有一种情况下,GOTO是唯一有效的解决方案 我想这取决于你所说的有效。我想您会问,是否存在一个只能使用goto语句编写的程序。在这种情况下,答案是没有这样的计划。Delphi是图灵完备的,有或没有goto语句 但是,如果我们准备将讨论范围扩大到其他语言,则在某些情况下,goto是一个很好的解决方案,甚至是最好的解决方案。最常想到的场景是在没有结构化异常处理的语言中实现整理和错误处理。如果你

goto
语句是我工作中的禁忌。
所以下面的问题就诞生了

是否有一种情况下,
goto
是唯一有效的解决方案

是否有一种情况下,
GOTO
是唯一有效的解决方案

我想这取决于你所说的有效。我想您会问,是否存在一个只能使用
goto
语句编写的程序。在这种情况下,答案是没有这样的计划。Delphi是图灵完备的,有或没有
goto
语句


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

Goto非常古老。它早于子例程,如函数和过程!这也是非常危险的,并且会降低代码的可读性(对其他人,或者几个月后对自己)

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


但在实践中,在某些情况下,从代码流中“跳出”有时是“方便”和“可读性更好”的,而这正是出现异常的原因
raise
脱离当前执行,跳转到最近的
最后
除了
部分。这更安全,因为它们是级联工作的,并且在出现这些边界条件时提供了更好的处理上下文的方法。(还有
break
abort
exit

最初GOTO被添加到Pascal中用于错误处理,包括Borland(/Embarcadero)从未实现的过程间表单(例如:从内部过程转到父过程),就像Borland从未实现其他内部函数功能一样,将内部函数传递给过程类型的参数。(*)

这样一来,后藤可以被视为例外的前兆

还有一些实际用途:上次我检查时,在Delphi中用goto跳出嵌套的IF语句比让代码自然退出嵌套的IF语句更快。 类似的优化有时用于压缩代码和其他具有深度嵌套循环或条件语句的复杂树处理代码

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

可以看到这是对象Pascal的Pascal级别的一部分,就像C++仍然允许完全的C完全一样。 (当然,由于Delphi中的优化压缩代码仅以.o格式提供,因此在Delphi代码库中很难找到示例。JPEG代码有一些,但这是C翻译)


(*)原始pascal和IIRC甚至Turbo pascal都不允许使用EXIT提前退出过程。CONTINUE和BREAK也是一样。

大约15年前,我在Delphi中使用goto语句将C转换为Pascal。C函数有一个switch()语句,在每个case之后都没有中断,而Pascal的case语句不能这样做。所以我把它转换成一堆Pascal标签和Goto。我想你还是要用最新的Delphi版本来做同样的事情。
编辑:我想使用gotos仍然是一种合理的方法。完成任务,简单易懂,仅限于一小段代码,没有危险。

转到
。任何可计算的算法都可以用赋值和
的组合来表示,如果
..
那么
开始
..
结束
,以及您在
时选择
执行
结束
重复
..
直到
。您甚至不需要子程序。:)

这就是所谓的结构化程序定理


有关证明,请参阅Corrado Böhm和Giuseppe Jacopini于1966年发表的论文。

在近20年的Delphi和可能的几百万行中,我从未使用过goto语句……在Delphi-XE4中,源目录下有14个
goto
语句。@Hugh如果,还是切换?这是一篇关于这个主题的好文章:那么,我们在这里是在反对任何流控制语句吗?我想不是。就我个人而言,我从来没有使用过
goto
exit
我不太喜欢,也没有使用过
break
我避免使用。不过,这完全取决于上下文。在2000行过程的中途,这些语句中有一个非常糟糕,但主要是因为2000行过程。是的,但真正的毒刺是COBOL中的
ALTER
语句,它可以动态地改变(实际上)一个
GOTO
语句的目标。所以你甚至不敢相信你的
GOTO
语句所说的话…@marjan遗憾地从COBOL中漏掉的是COMEFROM语句,而不是Pascal。它是专门为错误处理而添加到Pascal中的,@DavidHeffernan:如果我读得正确,那么如果不检查带有行号的
来自
语句,您就永远不会相信您正在阅读的流?三个Yikes!具有“无中断”情况的C风格switch语句可以转换为一系列if语句,对于无中断的情况,可以使用
x和not(y)
,甚至可能编译为大致相同的汇编代码。goto hack当时至少是非常直接地创建的。来点c