在做好一切的同时withgoto 很容易(由 f.ex. IL 证明),我想知道是否也可以消除all具有更高级别表达式和语句的 goto 语句 - 例如 - 使用 Java 支持的所有内容。
或者,如果您愿意:我正在寻找的是始终有效的“重写规则”,无论 goto 的创建方式如何。
它主要是作为一个理论问题,纯粹是出于兴趣;不作为好的/坏的做法。
我想到的明显的解决方案是使用这样的东西:
while (true)
{
switch (state) {
case [label]: // here's where all your goto's will be
state = [label];
continue;
default:
// here's the rest of the program.
}
}
虽然这可能会起作用并且确实适合我的“正式”问题,但我一点也不喜欢我的解决方案。其一,它非常丑陋;其二,它基本上将 goto 封装到一个 switch 中,其功能与 goto 的功能完全相同。
那么,有没有更好的解决方案呢?
Update 1
由于很多人似乎认为这个问题“太宽泛”,所以我将详细说明一下......我提到 Java 的原因是因为 Java 没有“goto”语句。作为我的爱好项目之一,我试图将 C# 代码转换为 Java,事实证明这是相当具有挑战性的(部分原因是 Java 中的这一限制)。
这让我思考。如果你有f.ex。开放寻址中“remove”方法的实现(参见:http://en.wikipedia.org/wiki/Open_addressing http://en.wikipedia.org/wiki/Open_addressing- 注意1),在特殊情况下使用“goto”非常方便,尽管在这种特殊情况下您可以通过引入“state”变量来重写它。请注意,这只是一个示例,我已经实现了用于延续的代码生成器,当您尝试反编译它们时,它会生成大量的 goto。
我也不确定在这件事上重写是否总是会消除“goto”语句,以及是否在每种情况下都允许它。虽然我并不是在寻找正式的“证据”,但一些证明在这件事上可以消除的证据就很好了。
因此,关于“广度”,我向所有认为“答案太多”或“重写 goto 的方法太多”的人提出挑战,请提供算法或重写一般情况的方法,因为我找到的唯一答案到目前为止是我发布的。