运算符的结合性在表达式求值期间如何工作?
How does associativity of operator work during evaluation of expression?
我正在学习 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())
因为-
是左结合的,不是右结合的。
None 这与评估顺序有关,它决定了首先调用哪个函数。
至于?:
是右结合,意思是
a ? b : c ? d : e
解析为
a ? b : (c ? d : e)
(如果您将 ?...:
视为单个运算符,这会稍微更有意义。)
但是,?:
保证 left-to-right 求值:第一个操作数总是先求值,然后正好是其他操作数之一(取决于第一个结果的真值)。
在你的例子中,
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
.
我正在学习 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())
因为-
是左结合的,不是右结合的。
None 这与评估顺序有关,它决定了首先调用哪个函数。
至于?:
是右结合,意思是
a ? b : c ? d : e
解析为
a ? b : (c ? d : e)
(如果您将 ?...:
视为单个运算符,这会稍微更有意义。)
但是,?:
保证 left-to-right 求值:第一个操作数总是先求值,然后正好是其他操作数之一(取决于第一个结果的真值)。
在你的例子中,
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
.