运算符优先级和关联性

时间:2016-04-30 14:45:07

标签: java operator-precedence

当表达式具有两个具有相同优先级的运算符时,将根据其关联性来计算表达式。我想知道以下是如何工作的:

i=b + b + ++b

i这里是4 因此++b没有更改前2个b值,但它首先执行,因为执行是从左到右。

然而,这里:

int b=1;
i= b+ ++b + ++b ;

i是6

根据关联性,我们应该执行第3个b所以它应该是: 1+ (++1) + ( ++1 should be done first)。所以它变成: 1 + ++ 1 + 2 = 5 但是,这是不对的,那么这是如何工作的呢?

2 个答案:

答案 0 :(得分:2)

您将优先级执行顺序混淆。

示例:

a[b] += b += c * d + e * f * g

优先规则规定*出现在+之前+=。关联性规则(它是优先规则的一部分)表明*是左关联的,+=是右关联的。

优先级/关联性规则基本上定义了隐式括号的应用,将上面的表达式转换为:

a[b] += ( b += ( (c * d) + ((e * f) * g) ) )

但是,此表达式仍然是评估从左到右。

这意味着表达式ba[b]的索引值将使用b执行之前b += ...的值。

对于更复杂的示例,混合+++=运算符,请参阅问题Incrementor logic和详细的answer of how it works

答案 1 :(得分:1)

它是正确的,第一个b是1,第二个b在加法之前将增加1,所以它是2,第三个b已经是2,并且增加1使它成为3所以它总共有6个。如你所说,表达式从左到右进行评估,因此第三个b在增量之前已经是2。