1

我有个问题。

在我的字节码中,我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);
}

发生的情况是,我需要计算左右两个运算符的表达式才能得到结果。第二种方法很明显:如果左边的表达式为零,则离开。这样你就不必计算两边了。

我的问题是:用第一种方法做错了吗?

先谢谢了。

4

1 回答 1

2

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

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

如果methodWithSideEffect()计算结果为falseotherMethodWithSideEffect()则不应调用。如果您按照您的建议进行预评估,那么您就违反了这个合同,因为这两种方法都会被调用。

没有表示逻辑与的操作码。我已经在您之前的问题中谈到了这一点

于 2013-06-12T20:11:29.917 回答