【问题标题】:How does associativity of operator work during evaluation of expression?运算符的关联性在表达式评估期间如何工作?
【发布时间】:2019-09-26 10:01:53
【问题描述】:

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

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

我假设输出为

8 8

但实际输出是

4 4

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

【问题讨论】:

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


【解决方案1】:

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

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&gt;b(产生false),这导致评估a=a+3(产生4),然后将其分配给c

【讨论】:

  • 这意味着关联规则仅适用于(表达式中存在另一个具有相同优先级的操作符,)否则不适用。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多