Java-括号和赋值

Java-括号和赋值,java,grouping,parentheses,operator-precedence,Java,Grouping,Parentheses,Operator Precedence,守则: int r=1; System.out.println(r + (r=2)); 输出为:3。但是我期望4,因为我认为括号内的代码是先执行的?如果需要4,就使用这个 int r=1; System.out.println((r=2) + r); // execute + is left-to-right +的关联性是从左到右的,表达式(r=2)的值是2 提及 在计算右操作数的任何部分之前,二元运算符的左操作数似乎已被完全计算 如果运算符是复合赋值运算符(§15.26.2),则对左手操作

守则:

int r=1;
System.out.println(r + (r=2));
输出为:3。但是我期望4,因为我认为括号内的代码是先执行的?

如果需要4,就使用这个

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

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

提及

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

如果运算符是复合赋值运算符(§15.26.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)
是在乘法之前计算的

除赋值运算符外,所有二进制运算符都从左到右求值;赋值运算符从右向左求值

所以
+
是从左到右计算的
赋值运算符,其中as赋值运算符是从右到左计算的。

如下所示

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

先执行?否,括号仅影响关联性。Java总是从左到右计算操作数。为什么期望4?只是好奇…谢谢。。。我认为括号中的代码首先执行是错误的。你能解释一下,它是如何计算为
4
?我不明白它是怎么工作的。根据我的理解,我假设它的工作原理是:
((r=2)+r)=>(2+r)=>(2+1)=3
。请详细说明。Thanks@John
r=2
将2分配给
r
。因此下次使用
r
时,其值为2。