为了账号安全,请及时绑定邮箱和手机立即绑定

if 语句的 Java 字节码指令

if 语句的 Java 字节码指令

互换的青春 2022-06-30 10:36:22
我有以下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 - trueArtClassInt.boo1(II)Z: I4 Branch 3 IF_ICMPGT L17 - falseArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - trueArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - falseArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - trueArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - falseArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - trueArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - false我对助记符(即,,等)完全感到IF_ICMPGE困惑IF_ICMPNE。通过查看源代码,我希望:方法中的 if 语句不 foo应该是if_icmpeqIF_ICMPNEboo和方法中的 if 语句不boo1应该是。 if_icmpleIF_ICMPGT方法中的一个zoo应该 if_icmplt不是IF_ICMPGE。有人可以解释这背后的原因吗?
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我猜你不应该假设你的陈述应该逐字转换为字节码。


唯一相关的是语义应该相同。在中间代码中将条件反转为对应项是很常见的,请考虑一个 while 循环:


while (x < y) {

  code;

}

可以编译为


START:

  CMP x y

  JMPGE END

  CODE

  JMP START

END:

  ...

您看到的是反转条件,这是一个常见的成语。这是因为反转条件允许您跳出块,因此只有在相反的情况下才执行它。


查看完整回答
反对 回复 2022-06-30
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

测试的条件被反转,因为如果条件为真,它会跳转(到else块),否则它会继续下一条指令。



查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信