运算符优先级和结合性

Operator Precedence and associativity

当一个表达式有两个优先级相同的运算符时,表达式根据其结合性进行计算。我想知道以下是如何工作的:

i=b + b + ++b

i这里是4 所以++b没有改变前2个b的值,而是先执行了,因为是从左到右执行的。

这里,然而:

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

i 是 6

根据结合律,我们应该执行第三个b所以它应该是: 1+ (++1) + ( ++1 should be done first)。所以它变成: 1 + ++1 + 2 =5 然而,这是不对的,那么这是如何工作的呢?

没错,第一个b是1,第二个b在加法前加1,所以是2,第三个b已经是2,加1就是3,所以一共是6 .如您所说,表达式是从左到右计算的,因此第三个 b 在增量之前已经是 2。

您混淆了优先级执行顺序

示例:

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

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

Precedence/associativity 规则基本上定义了隐式括号的应用,将上面的表达式转换为:

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

但是,此表达式仍然计算 从左到右。

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

有关更复杂的示例,混合 +++= 运算符,请参阅问题 , and the detailed