【问题标题】:Java - parentheses and assignmentJava - 括号和赋值
【发布时间】:2013-07-22 09:34:42
【问题描述】:

代码:

int r=1;
System.out.println(r + (r=2));

输出是:3。但我期望的是4,因为我认为括号内的代码是先执行的?

【问题讨论】:

  • 先执行?不,括号只会影响关联性。 Java 总是从左到右计算操作数。
  • 你为什么期望 4?只是好奇...
  • 谢谢...我假设括号中的代码首先执行是错误的。

标签: java grouping parentheses operator-precedence


【解决方案1】:

Official Docs on Operators says

除赋值运算符外的所有二元运算符都是从左到右计算的;赋值运算符从右到左求值。

所以+ 被评估left-to-right,而赋值运算符被评估right to left.

【讨论】:

    【解决方案2】:

    如果你想使用这个 4

    int r=1;
    System.out.println((r=2) + r); // execute + is left-to-right
    

    【讨论】:

    • 您能否解释一下,它对4 的评估如何?我无法理解它是如何工作的。根据我的理解,我假设它会像这样工作:((r=2) + r) => ( 2 + r ) => (2 + 1) = 3。请详细说明。谢谢
    • @John r=2 将 2 分配给 r。所以下次使用r时,其值为2。
    【解决方案3】:

    + 的关联性是从左到右的,表达式(r=2) 的值是2

    参考JLS 15.7

    二元运算符的左侧操作数似乎在右侧操作数的任何部分被评估之前已被完全评估。

    如果运算符是复合赋值运算符(第 15.26.2 节),则左侧操作数的评估包括记住左侧操作数表示的变量以及获取和保存该变量的值以用于隐含的二元运算。

    如果二元运算符左侧操作数的求值突然完成,则右侧操作数的任何部分似乎都没有被求值。

    【讨论】:

      【解决方案4】:

      是这样的

      (r + (r=2))
      (1 + (r=2))
      (1 + (2))
      (3)
      

      【讨论】:

        【解决方案5】:

        r=2 语句的值为 2。不过,括号之间的嵌套表达式首先被处理。

        例如:

        int r=2;
        System.out.println(r * (r=2 + 1));
        

        输出:

        6
        

        为什么?因为r = 2 + 1 返回3

        同:

        int r=2;
        System.out.println(r * (2 + 1));
        

        输出仍然是6,因为(2 + 1) 在乘法之前被评估。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-21
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多