代码之家  ›  专栏  ›  技术社区  ›  Martin Thoma

ifne和ifnonnull之间有什么区别?

  •  3
  • Martin Thoma  · 技术社区  · 12 年前

    我刚读完 Java bytecode instruction listings 并想知道:

    两者之间的区别是什么 ifne ifnonnull 在Java Bytecode中?

    我知道在高级语言(例如Java)中 0 是一个具有一些运算(如加法、减法、乘法)的数值,可以与其他数值进行比较,而 null 是表示“无值”的值。

    我想我的一个问题是我不知道怎么做 无效的 可以用字节码/程序集表示。

    1 回复  |  直到 12 年前
        1
  •  3
  •   Community Mohan Dere    5 年前

    JVM规范对此可能更清楚。

    所以 ifne (and ifeq etc) 限制是:

    国际石油当量 指令是类型安全的,如果可以有效地从传入操作数堆栈中弹出类型匹配的int,产生传出类型状态NextStackFrame,并且指令的操作数Target是假定传入类型状态为NextStack Frame的有效分支目标。

    鉴于 ifnonnull 限制是:

    如果一条ifnonnull指令是类型安全的,则只要它可以有效地从传入操作数堆栈中弹出一个类型匹配引用,从而产生传出类型状态NextStackFrame,并且该指令的操作数Target是假定传入类型状态为NextStack Frame的有效分支目标。

    大体上 国际石油当量 如果 表示整数值,而 如果非空 为参考值。

    要比较两个相等的引用,请使用 if_acmpeq 相反 如果非空 实际上是一种特殊情况 操作数,因为它总是与null进行比较。

    就如何 null 引用表示在 数据 ,JVM规范 explicitly allows this to be implementation-specific :

    引用值也可以是特殊的空引用,即对无对象的引用,在这里用null表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为空。

    Java虚拟机规范不要求对空进行具体的值编码。