表达式评估期间,运算符的关联性如何工作?

Tan*_*arg 0 c++ conditional-operator associativity right-to-left left-to-right

我正在学习C ++中的优先规则。据说其中条件运算符具有从右到左的关联性。我将其解释为对表达式的评估从右开始,然后从左开始。因此,对于以下代码,

int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;
Run Code Online (Sandbox Code Playgroud)

我假设输出为

8 8
Run Code Online (Sandbox Code Playgroud)

但是实际输出是

4 4
Run Code Online (Sandbox Code Playgroud)

我不了解这种关联性实际上是如何工作的,因为从上面的输出中,在我看来,条件运算符已经从左到右具有关联性。

mel*_*ene 6

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

f() - g() - h()
Run Code Online (Sandbox Code Playgroud)

解析为

(f() - g()) - h()
Run Code Online (Sandbox Code Playgroud)

并不是

f() - (g() - h())
Run Code Online (Sandbox Code Playgroud)

因为-是左联想,而不是右联想。

这些都与评估顺序无关,该评估顺序确定首先调用哪个功能。

对于?:正确的联想,这意味着

a ? b : c ? d : e
Run Code Online (Sandbox Code Playgroud)

解析为

a ? b : (c ? d : e)
Run Code Online (Sandbox Code Playgroud)

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

但是,要?:保证从左到右的求值:始终首先对第一个操作数求值,然后对另一个操作数正好求值(取决于第一个结果的真值)。


在您的示例中

c=a>b? a=a*2: a=a+3
Run Code Online (Sandbox Code Playgroud)

(请不要?:像实际代码那样将赋值放入内部)被解析为

c = ((a>b) ? (a=a*2) : (a=a+3))
Run Code Online (Sandbox Code Playgroud)

这完全是由于优先级,而不是关联性(这里没有彼此相邻的多个相同运算符)。

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