运算符的结合性在表达式求值期间如何工作?

How does associativity of operator work during evaluation of expression?

我正在学习 C++ 中的优先规则。其中条件运算符被称为具有从右到左的结合性。 我将此解释为表达式的评估从右开始并向左进行。 所以,对于下面的代码-

int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;

我假设输出为

8 8

但实际输出是

4 4

我不明白这种结合性实际上是如何工作的,因为从上面的输出来看,在我看来条件运算符具有从左到右的结合性。

关联性告诉您如果同一运算符连续出现多个实例会发生什么情况。例如,

f() - g() - h()

解析为

(f() - g()) - h()

而不是

f() - (g() - h())

因为-是左结合的,不是右结合的。

None 这与评估顺序有关,它决定了首先调用哪个函数。

至于?:是右结合,意思是

a ? b : c ? d : e

解析为

a ? b : (c ? d : e)

(如果您将 ?...: 视为单个运算符,这会稍微更有意义。)

但是,?: 保证 left-to-right 求值:第一个操作数总是先求值,然后正好是其他操作数之一(取决于第一个结果的真值)。


在你的例子中,

c=a>b? a=a*2: a=a+3

(请不要像在实际代码中那样在 ?: 中赋值)被解析为

c = ((a>b) ? (a=a*2) : (a=a+3))

这完全是由于优先级,而不是结合性(我们这里没有多个相同的运算符并排)。

a>b 首先被评估(产生 false),这导致 a=a+3 被评估(产生 4),然后分配给 c.