考虑一个简单的例子
private static String isPositive(int val) {
if (val > 0) {
return "yes";
} else {
return "no";
}
}
这里很简单:如果val > 0
,则返回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
。
起初,我认为<=
的检查更便宜,并且这是某种优化。但是如果我将我的初始代码更改为
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
那么,这种行为有原因吗?它可以变得更加直截了当吗?