我正在学习C ++中的优先规则。据说其中条件运算符具有从右到左的关联性。 我将其解释为对表达式的评估从右开始,然后从左开始。 因此,对于以下代码-
int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;
我假设输出为
8 8
但是实际输出是
4 4
我不了解这种关联性实际上是如何工作的,因为从上面的输出中,在我看来条件运算符已经从左到右具有关联性。
答案 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
。