我有一个问题。
在我的字节码中,我使用此代码计算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 :(得分:2)
IAND
操作码用于按位操作(&
)。是的,如果您尝试实现短路逻辑和运算符(&&
),则预先评估左右操作数是错误的。考虑如果你的操作数有副作用会发生什么:
if (methodWithSideEffect() && otherMethodWithSideEffect()) {}
如果methodWithSideEffect()
评估为false
,则不应调用otherMethodWithSideEffect()
。如果按照建议进行预评估,则会违反此合同,因为这两种方法都会被调用。
没有代表逻辑和操作码的操作码。我已在上一个问题here中提到过这个问题。