2013-07-23 71 views
2

代码:爪哇 - 括号和分配

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

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

+0

先执行?不,括号只影响关联性。 Java总是从左到右评估操作数。 – johnchen902

+0

你为什么期望4?只是好奇... – oliverdejohnson

+0

Thx all ...我推测,首先执行括号中的代码是错误的。 – BigJ

回答

3

Official Docs on Operators says

除了赋值运算符所有二元运算符是从左向右计算;赋值运算符从右向左评估。

所以+评估left-to-right,那里的赋值运算符评估right to left.

3

使用,如果你想关联性的+这4

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

+的相关性是从左到右的 –

+0

您能解释一下,它是如何评估为'4'的?我无法理解它是如何工作的。基于我的理解,我假设它的工作原理是:((r = 2)+ r)=>(2 + r)=>(2 + 1)= 3'。请详细说明。谢谢 – John

+0

@John'r = 2'将2赋给'r'。所以下次使用'r'时,其值为2. – user3932000

3

是左到右,并表达(r=2)的值是2

参见JLS 15.7

二进制运算符的左边的操作数出现的右侧操作数的任何部分被评估前被完全评估。

如果运算符是一个复合赋值运算符(第15.26.2节),则对左侧运算数的求值既包括记住左侧运算数所表示的变量,又保存该变量的值以用于隐含的二元操作。

如果评估二元运算符的左侧操作数突然完成,则右侧操作数的任何部分都不会被评估。

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)是乘法之前评估。

3

是这样的

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

+1这是正确的解释。 – NINCOMPOOP