我有个问题。
在我的字节码中,我使用以下代码计算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。这样,你就不用两边都计算了。
我的问题是:用第一种方法做错了吗?
1条答案
按热度按时间m2xkgtsf1#
IAND
操作码适用于位运算(&
)。是的,如果尝试实现短路逻辑与运算符(&&
),则预计算左操作数和右操作数是错误的。请考虑如果操作数具有副作用会发生什么情况:如果
methodWithSideEffect()
的计算结果为false
,则不应调用otherMethodWithSideEffect()
。如果按照建议进行预计算,则违反了此约定,因为两个方法都将始终被调用。没有操作码代表逻辑AND,我在你之前的问题here中已经提到了。