我正在学习 C++ 中的优先规则。其中条件运算符被称为具有从右到左的关联性。我将此解释为表达式的评估从右开始并继续向左。所以,对于下面的代码 -
int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;
我假设输出为
8 8
但实际输出是
4 4
我不明白这种关联性实际上是如何工作的,因为从上面的输出来看,在我看来,条件运算符具有从左到右的关联性。
我正在学习 C++ 中的优先规则。其中条件运算符被称为具有从右到左的关联性。我将此解释为表达式的评估从右开始并继续向左。所以,对于下面的代码 -
int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;
我假设输出为
8 8
但实际输出是
4 4
我不明白这种关联性实际上是如何工作的,因为从上面的输出来看,在我看来,条件运算符具有从左到右的关联性。
关联性告诉您如果同一运算符连续有多个实例会发生什么。例如,
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
。