编码:
int r=1;
System.out.println(r + (r=2));
输出是:3。但我期望是 4,因为我认为括号内的代码是先执行的?
编码:
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
。
请参阅JLS 15.7
在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已被完全评估。
如果运算符是复合赋值运算符(第 15.26.2 节),则左侧操作数的评估包括记住左侧操作数表示的变量以及获取和保存该变量的值以用于隐含的二元运算.
如果二元运算符的左侧操作数的求值突然完成,则右侧操作数的任何部分似乎都没有被求值。
除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左求值。
So +
被评估left-to-right
,其中 as 赋值运算符被评估right to left.
就像这样
(r + (r=2))
(1 + (r=2))
(1 + (2))
(3)
statement 的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)
在乘法之前评估。