Java - 括号和赋值

时间:2013-07-23 10:51:08

标签: java grouping parentheses operator-precedence

代码:

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

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

5 个答案:

答案 0 :(得分:3)

如果你想要4

,请使用此选项
int r=1;
System.out.println((r=2) + r); // execute + is left-to-right

答案 1 :(得分:3)

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

参考JLS 15.7

  

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

     

如果运算符是复合赋值运算符(第15.26.2节),则对左侧操作数的计算包括记住左侧操作数表示的变量并获取并保存该变量的值以供在隐含的二元操作。

     

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

答案 2 :(得分:3)

Official Docs on Operators says

  

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

因此评估+ left-to-right,其中评估赋值运算符right to left.

答案 3 :(得分:3)

就像这样

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

答案 4 :(得分:2)

语句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)