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

时间:2019-05-08 15:55:06

标签: c++ right-to-left conditional-operator associativity left-to-right

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

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

我假设输出为

8 8

但是实际输出是

4 4

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

1 个答案:

答案 0 :(得分:5)

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

f() - g() - h()

解析为

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

不是

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

因为-是左关联的,而不是右关联的。

这与评估顺序无关,评估顺序决定哪个函数被首先调用。

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

a ? b : c ? d : e

解析为

a ? b : (c ? d : e)

(如果您将?...:看作是单个运算符,这会更有意义。)

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


在您的示例中,

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