asm运算符&& amp;或||

时间:2013-06-12 19:59:31

标签: java compiler-construction jvm bytecode

我有一个问题。

在我的字节码中,我使用此代码计算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);
}

我需要左右计算两个运算符的表达式才能得到结果。第二种方法很明显:如果左表达式为零则离开。这样你就不必同时计算侧上。

我的问题是:用第一种方式做错是不对的?

先谢谢。

1 个答案:

答案 0 :(得分:2)

IAND操作码用于按位操作(&)。是的,如果您尝试实现短路逻辑和运算符(&&),则预先评估左右操作数是错误的。考虑如果你的操作数有副作用会发生什么:

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

如果methodWithSideEffect()评估为false,则不应调用otherMethodWithSideEffect()。如果按照建议进行预评估,则会违反此合同,因为这两种方法都会被调用。

没有代表逻辑和操作码的操作码。我已在上一个问题here中提到过这个问题。