gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:20:55 28 4
gpt4 key购买 nike

我有一个问题。

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

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

我的问题是:第一种方法是否错误?

最佳答案

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

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

如果 methodWithSideEffect() 的计算结果为 false,则不应调用 otherMethodWithSideEffect()。如果您按照建议进行预评估,那么您就违反了此约定,因为这两种方法都会始终被调用。

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

关于java - asm 运算符 && 或 || 中的字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com