考虑简单的例子
private static String isPositive(int val) {
if (val > 0) {
return "yes";
} else {
return "no";
}
}
这非常简单:如果val > 0
return yes
否则返回no
。
但编译后,在字节码中,这个 if 条件相反:
private static isPositive(I)Ljava/lang/String;
L0
LINENUMBER 12 L0
ILOAD 0
IFLE L1
L2
LINENUMBER 13 L2
LDC "yes"
ARETURN
L1
LINENUMBER 15 L1
FRAME SAME
LDC "no"
ARETURN
它检查:如果val <= 0
然后返回no
,否则返回yes
.
首先,我认为<=
check 更便宜,而且是某种优化。但是如果我将初始代码更改为
if (val <= 0) {
return "no";
} else {
return "yes";
}
它仍然会在字节码中被反转:
L0
LINENUMBER 12 L0
ILOAD 0
IFGT L1
L2
LINENUMBER 13 L2
LDC "no"
ARETURN
L1
LINENUMBER 15 L1
FRAME SAME
LDC "yes"
ARETURN
那么,这种行为是有原因的吗?可以改成直接的吗?
可能是这样完成的,以便中的两个代码块if
在翻译后的字节码中以相同的顺序显示。
例如,这段 Java 代码:
if (val > 0) {
return "yes";
} else {
return "no";
}
翻译成这样(伪代码):
If val <= 0, then branch to L1
return "yes"
L1:
return "no"
请注意,在原始 Java 代码中,if
检查条件以查看是否应运行第一个代码块,而在翻译后的字节码中,将进行检查以查看是否应采用分支(跳过第一个代码块)。所以它需要检查补充条件。
可以改成直接的吗?
当然,也可以保留条件,但是您需要颠倒两个代码块的顺序:
If val > 0, then branch to L1
return "no"
L1:
return "yes"
不过,我不会说这个版本比前一个版本“更直接”。
无论如何,你为什么要改变它?两个版本都应该没问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)