【问题标题】:Bytecode in asm operators && or ||asm 运算符 && 或 || 中的字节码
【发布时间】:2013-06-12 19:59:30
【问题描述】:

我有一个问题。

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

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

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

提前致谢。

【问题讨论】:

    标签: java compiler-construction jvm bytecode


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哦好的。你能用||做同样的图表吗?就像你在上一个问题中对 && 所做的那样?
    • 如果您返回并接受您本周提出的所有问题的答案,我可能愿意这样做:)。
    • 应该有一个按钮可以让你“接受”一个答案。这个想法是,对于提出的每个问题,最佳答案都会被“接受”,并且提供答案的用户会获得声誉积分。每个问题您只能接受一个答案。该按钮应位于向上/向下投票按钮附近(您还应该为好的答案投票)。
    • 我不知道那个抱歉的麦克。
    • 没问题:)。由于我无法将多行代码 sn-ps 放入 cmets,因此我将修改我对上一个问题的回答,以包括对 || 运算符的描述。作为补充说明,对好的答案进行投票也是一种很好的礼仪(即使您不接受它们)。您还可以为有见地的 cmets 点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多