0

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

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

我假设输出为

8 8

但实际输出是

4 4

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

4

1 回答 1

6

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

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首先被评估(yielding false),这导致a=a+3被评估(yielding 4),然后被分配给c

于 2019-05-08T16:02:06.483 回答