我有以下Java类:
public class ArtClassInt {
public boolean foo(int x) {
if(x == 3956681)
return true;
else
return false;
}
public boolean boo(int x) {
if(x <= 952140568)
return true;
else
return false;
}
public boolean boo1(int x, int y) {
if(x <= y)
return true;
else
return false;
}
public boolean zoo(int x) {
if(x+1 < 1267)
return true;
else
return false;
}
}
当我编译它并获取其字节码时,得到了与源代码中的if语句相对应的以下语句:
ArtClassInt.boo1(II)Z: I4 Branch 3 IF_ICMPGT L17 - true
ArtClassInt.boo1(II)Z: I4 Branch 3 IF_ICMPGT L17 - false
ArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - true
ArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - false
ArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - true
ArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - false
ArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - true
ArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - false
我对助记符感到困惑(例如IF_ICMPGE
,IF_ICMPNE
等)。通过查看源代码,我期望:
foo
方法中的if语句不应为if_icmpeq
IF_ICMPNE
boo
和boo1
方法中的if语句应
是if_icmple
而不是IF_ICMPGT
。 zoo
中的一个应该是
if_icmplt
不是IF_ICMPGE
。有人可以解释其背后的原因吗?
答案 0 :(得分:2)
测试的条件被反转,因为如果条件为真,则它会跳转(跳至else
块,否则将继续执行下一条指令。
答案 1 :(得分:2)
我猜您不应该假设您的语句应逐字转换为字节码。
唯一相关的是语义应该相同。在中间代码中将条件转换为对应条件的情况很常见,请考虑一下while循环:
while (x < y) {
code;
}
可以编译为
START:
CMP x y
JMPGE END
CODE
JMP START
END:
...
您看到的是反转条件,这是一个常见的成语。这是因为反向条件允许您跳出一个块,因此仅当相反情况成立时才执行它。