虽然使用goto 做任何事情都很容易(如 f.ex. IL 所证明的那样),但我想知道是否也可以使用 Java 支持的所有内容来消除具有更高级别表达式和语句的所有goto 语句 - 比如说。
或者,如果您喜欢:我正在寻找的是始终有效的“重写规则”,无论 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 包装到一个与 goto 完全相同的开关中。
那么,有没有更好的解决方案?
更新 1
由于很多人似乎认为这个问题“太宽泛”,所以我将详细说明……我提到 Java 的原因是因为 Java 没有“goto”语句。作为我的爱好项目之一,我试图将 C# 代码转换为 Java,这被证明是非常具有挑战性的(部分原因是 Java 中的这种限制)。
这让我思考。如果你有 f.ex. 开放寻址中'remove'方法的实现(参见:http ://en.wikipedia.org/wiki/Open_addressing - 注1),在特殊情况下使用'goto'非常方便,尽管在这个特殊的情况下如果您可以通过引入“状态”变量来重写它。请注意,这只是一个示例,我已经为延续实现了代码生成器,当您尝试对它们进行反编译时,它们会产生大量的 goto。
我也不确定在这件事上重写是否总是会消除“goto”语句,以及是否在每种情况下都允许。虽然我不是在寻找正式的“证据”,但有一些证据表明在这件事上可以消除是很好的。
所以关于“广泛性”,我挑战所有认为有“太多答案”或“重写 goto 的多种方法”的人,以提供一种算法或一种方法来重写一般情况,因为我找到的唯一答案到目前为止是我发布的一个。