为了账号安全,请及时绑定邮箱和手机立即绑定

在支持循环和功能的语言中使用“ goto”是否有优势?如果是这样,为什么?

在支持循环和功能的语言中使用“ goto”是否有优势?如果是这样,为什么?

一只萌萌小番薯 2019-10-05 11:12:11
长期以来,我一直认为,goto如果可能,永远不要使用。前几天在阅读libavcodec(用C编写)时,我注意到它的多种用法。使用goto支持循环和功能的语言是否有优势?如果是这样,为什么?
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我知道有一些使用“ goto”语句的原因(有些已经讲过):


干净地退出功能


通常在函数中,您可能会分配资源,并且需要在多个位置退出。程序员可以通过将资源清除代码放在函数的末尾来简化其代码,并且该函数的所有“退出点”都将进入清除标签。这样,您不必在函数的每个“退出点”都编写清除代码。


退出嵌套循环


如果您处于嵌套循环中并且需要脱离所有循环,那么goto可以比break语句和if-checks更加简洁明了。


低级性能改进


这仅在性能至关重要的代码中有效,但是goto语句执行得非常快,并且在遍历函数时可以为您提供帮助。但是,这是一把双刃剑,因为编译器通常无法优化包含gotos的代码。


请注意,在所有这些示例中,gotos仅限于单个函数的范围。


查看完整回答
反对 回复 2019-10-05
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

由于goto使程序流程难以进行推理1(又称“意大利面条代码”),goto因此通常仅用于补偿缺少的功能:使用goto可能实际上是可以接受的,但前提是该语言没有提供更结构化的变体来获取相同的目标。以Doubt为例:

我们使用goto的规则是goto可以跳转到函数中的单个出口清理点。

这是正确的-但前提是该语言不允许使用清理代码(例如RAII或finally)进行结构化异常处理,这样做的效果更好(因为它是专门为此目的而构建的),或者在有充分理由不这样做的情况下使用结构化异常处理(但除非是非常低的级别,否则您永远不会遇到这种情况)。

在大多数其他语言中,唯一可接受的用法goto是退出嵌套循环。甚至在那里,将外部循环提升为自己的方法并改用它几乎总是更好的选择return

除此之外,这goto表明没有对特定代码进行足够的思考。


1支持的现代语言goto实现了一些限制(例如,goto可能不会跳入或跳出功能),但问题从根本上保持不变。

顺便说一句,其他语言功能当然也是如此,最明显的例外是。而且通常有严格的规则来仅在指示的地方使用这些功能,例如不使用异常来控制非异常程序流的规则。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信