【发布时间】:2017-02-11 12:55:24
【问题描述】:
我应该如何理解这种 Java 编译器行为?
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
谢谢。
编辑:
几分钟后我发现了重点:
在第一种情况下,由于无限循环,编译器会抛出错误。在这两种情况下,编译器都不会考虑语句 consequent 中的代码。
编辑二:
javac 现在让我印象深刻的是:
if (true) return; // Correct
}
while (true) return; // Correct
}
看起来 javac 知道两个循环内部的内容,如果结果, 但是当您编写另一个命令时(如第一个示例中所示),您会得到非等效行为(看起来 javac 忘记了循环/if 中的内容)。
公共静态最终编辑三:
作为这个答案的结果,我可能会说(希望是正确的):
对于 Java,if (arg) { ...; return;} 和 while (arg) { ...; return;} 在语义和句法上(在字节码中)是等价的,如果 argv 是非常量(或有效的最终类型)表达式。如果argv 是常量表达式,字节码(和行为)可能会有所不同。
免责声明
这个问题不是关于无法到达的语句,而是对逻辑等价表达式的不同处理,例如while true return 和if true return。
【问题讨论】:
-
这是一个“如果我写了疯狂的代码,编译器也可能会疯狂”的案例。
-
@Andremoniy 不。请仔细阅读。
-
@marek094,您进行这种比较的目的是什么? Java 不是低级语言,可以说编译器不是机器语言编译器。您正在寻找的确切答案是什么,或者您打算问的确切问题是什么?此外,考虑到当今可用的虚拟机和编译器的数量,在我看来,可以说是非常通用且信息量较少的问题。
-
@SiddharthTyagi 这是为我的考试做准备,我应该回答写在纸上的类似问题。 ¯_(ツ)_/¯
-
@marek094 如果语法正确,您只有合理的语义。没有可编译的代码可能有语义的意图,但没有实际的语义。
标签: java javac unreachable-code