代码:
int r=1;
System.out.println(r + (r=2));
输出是:3。但我预计4,因为我认为括号内的代码是先执行的?
答案 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)
。