【问题标题】:Java postfix operator precedence in expressions with method calls带有方法调用的表达式中的 Java 后缀运算符优先级
【发布时间】:2014-08-02 02:30:57
【问题描述】:

我的疑问是为什么在下面的代码中输出分别是 2 和 1? 这真的好吗? 在我看来,方法 'm' 应该接收值 1,因为它在变量 'i' 上使用了后缀运算符而不是前缀运算符。

public class PostfixDoubt {

    public static void main(String[] args) {
        int i = 1;
        // why does m receive 2 as argument and not 1?
        i = i++ + m(i);
        System.out.println(i);
    }

    public static int m(int i) {
        System.out.println(i);
        return 0;
    }
}

下面是用javap反编译的字节码:

public class PostfixDoubt {
  public PostfixDoubt();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: iinc          1, 1
       6: iload_1
       7: invokestatic  #16                 // Method m:(I)I
      10: iadd
      11: istore_1
      12: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
      15: iload_1
      16: invokevirtual #26                 // Method java/io/PrintStream.println:(I)V
      19: return

  public static int m(int);
    Code:
       0: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: iload_0
       4: invokevirtual #26                 // Method java/io/PrintStream.println:(I)V
       7: iconst_0
       8: ireturn
}

【问题讨论】:

    标签: java operator-keyword operator-precedence


    【解决方案1】:

    这个操作

    i++
    

    增加存储在i 变量中的值并返回其先前的值。当 i 被重新评估以作为参数传递给

    m(i)
    

    使用新的、递增的值。


    int i = 1;
    i = i++ + m(i);
    

    看起来像

    1: 1 (i = 2) + m(i)
    2: 1 (i = 2) + m(2)
    3: 1 (i = 2) + Whatever value m(2) returns
    4: whatever value is the result of that addition
    5: that value is assigned to i
    

    【讨论】:

    • 是的,我明白了,但是为什么当 m(i) 返回时,他的结果会加 1?如果我已经被重新评估,它应该是 2。我错过了什么吗?
    • 看起来 i 被重新评估了两次。首先将它传递给 m(i),然后当它用 i = 重新分配给自身时
    • @staroski 这就是我在编辑中的意思。它没有被重新评估。 i++ 产生一个值(被压入堆栈)并且 i 递增。 m(i) 重新访问 i 以获取其新值。但是+ 操作获得了之前被压入堆栈的i++ 的值。
    • @staroski 如果您还没有,请查看byte code instructions。你刚才描述的基本上是字节码中发生的事情。
    • 哦,是的,谢谢@Sotirios。抱歉,我只是没有看到它一步一步发生。代码的工作原理完全一样:int variable = 1;int postfix_result = variable++;int incremented_variable = variable;variable = postfix_result + m(incremented_variable);System.out.println(variable);
    猜你喜欢
    • 2021-10-25
    • 2019-02-13
    • 2020-06-23
    • 2018-08-22
    • 2015-09-16
    • 2013-08-04
    • 2017-10-25
    • 2016-08-20
    • 2020-07-05
    相关资源
    最近更新 更多