运算符优先级和结合性
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 。
当一个表达式有两个优先级相同的运算符时,表达式根据其结合性进行计算。我想知道以下是如何工作的:
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
的值。
有关更复杂的示例,混合 ++
和 +=
运算符,请参阅问题