jvm asm运算符&&或中的字节码||

sauutmhj  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(97)

我有个问题。
在我的字节码中,我使用以下代码计算if((1==1) && (2==2)){}这样的语句:

if (node.getOperator().equals(Operator.LOGICAL_AND)) {
    mn.instructions.add(new InsnNode(Opcodes.IAND));
    jmp = new JumpInsnNode(Opcodes.IFNE, null);
    mn.instructions.add(jmp);
}

实际情况是,我需要计算两个运算符的表达式的右和左,以得到结果。第二种方法是显而易见的:如果左边的表达式为0,那么leave。这样,你就不用两边都计算了。
我的问题是:用第一种方法做错了吗?

m2xkgtsf

m2xkgtsf1#

IAND操作码适用于位运算(&)。是的,如果尝试实现短路逻辑与运算符(&&),则预计算左操作数和右操作数是错误的。请考虑如果操作数具有副作用会发生什么情况:

if (methodWithSideEffect() && otherMethodWithSideEffect()) {}

如果methodWithSideEffect()的计算结果为false,则不应调用otherMethodWithSideEffect()。如果按照建议进行预计算,则违反了此约定,因为两个方法都将始终被调用。
没有操作码代表逻辑AND,我在你之前的问题here中已经提到了。

相关问题