Tan*_*arg 0 c++ conditional-operator associativity right-to-left left-to-right
我正在学习C ++中的优先规则。据说其中条件运算符具有从右到左的关联性。我将其解释为对表达式的评估从右开始,然后从左开始。因此,对于以下代码,
int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;
Run Code Online (Sandbox Code Playgroud)
我假设输出为
8 8
Run Code Online (Sandbox Code Playgroud)
但是实际输出是
4 4
Run Code Online (Sandbox Code Playgroud)
我不了解这种关联性实际上是如何工作的,因为从上面的输出中,在我看来,条件运算符已经从左到右具有关联性。
关联性告诉您如果连续有多个相同运算符的实例,会发生什么情况。例如,
f() - g() - h()
Run Code Online (Sandbox Code Playgroud)
解析为
(f() - g()) - h()
Run Code Online (Sandbox Code Playgroud)
并不是
f() - (g() - h())
Run Code Online (Sandbox Code Playgroud)
因为-是左联想,而不是右联想。
这些都与评估顺序无关,该评估顺序确定首先调用哪个功能。
对于?:正确的联想,这意味着
a ? b : c ? d : e
Run Code Online (Sandbox Code Playgroud)
解析为
a ? b : (c ? d : e)
Run Code Online (Sandbox Code Playgroud)
(如果您将其?...:视为单个运算符,这会更有意义。)
但是,要?:保证从左到右的求值:始终首先对第一个操作数求值,然后对另一个操作数正好求值(取决于第一个结果的真值)。
在您的示例中
c=a>b? a=a*2: a=a+3
Run Code Online (Sandbox Code Playgroud)
(请不要?:像实际代码那样将赋值放入内部)被解析为
c = ((a>b) ? (a=a*2) : (a=a+3))
Run Code Online (Sandbox Code Playgroud)
这完全是由于优先级,而不是关联性(这里没有彼此相邻的多个相同运算符)。
a>b首先被评估(yielding false),这导致a=a+3被评估(yielding 4),然后将其分配给c。