3 回答
TA贡献1834条经验 获得超8个赞
我知道有一些使用“ goto”语句的原因(有些已经讲过):
干净地退出功能
通常在函数中,您可能会分配资源,并且需要在多个位置退出。程序员可以通过将资源清除代码放在函数的末尾来简化其代码,并且该函数的所有“退出点”都将进入清除标签。这样,您不必在函数的每个“退出点”都编写清除代码。
退出嵌套循环
如果您处于嵌套循环中并且需要脱离所有循环,那么goto可以比break语句和if-checks更加简洁明了。
低级性能改进
这仅在性能至关重要的代码中有效,但是goto语句执行得非常快,并且在遍历函数时可以为您提供帮助。但是,这是一把双刃剑,因为编译器通常无法优化包含gotos的代码。
请注意,在所有这些示例中,gotos仅限于单个函数的范围。
TA贡献1865条经验 获得超7个赞
由于goto
使程序流程难以进行推理1(又称“意大利面条代码”),goto
因此通常仅用于补偿缺少的功能:使用goto
可能实际上是可以接受的,但前提是该语言没有提供更结构化的变体来获取相同的目标。以Doubt为例:
我们使用goto的规则是goto可以跳转到函数中的单个出口清理点。
这是正确的-但前提是该语言不允许使用清理代码(例如RAII或finally
)进行结构化异常处理,这样做的效果更好(因为它是专门为此目的而构建的),或者在有充分理由不这样做的情况下使用结构化异常处理(但除非是非常低的级别,否则您永远不会遇到这种情况)。
在大多数其他语言中,唯一可接受的用法goto
是退出嵌套循环。甚至在那里,将外部循环提升为自己的方法并改用它几乎总是更好的选择return
。
除此之外,这goto
表明没有对特定代码进行足够的思考。
1支持的现代语言goto
实现了一些限制(例如,goto
可能不会跳入或跳出功能),但问题从根本上保持不变。
顺便说一句,其他语言功能当然也是如此,最明显的例外是。而且通常有严格的规则来仅在指示的地方使用这些功能,例如不使用异常来控制非异常程序流的规则。
- 3 回答
- 0 关注
- 694 浏览
添加回答
举报