在表达式求值期间,运算符的关联性是如何工作的? 我在C++中学习优先级规则。其中条件运算符被称为具有从右到左的关联性。 我将其解释为表达式的求值从右开始,然后向左进行。 因此,对于下面的代码- int a=1, b=2, c; c=a>b? a=a*2: a=a+3; cout<<c<<" "<<a;
但实际产出是有限的在表达式求值期间,运算符的关联性是如何工作的? 我在C++中学习优先级规则。其中条件运算符被称为具有从右到左的关联性。 我将其解释为表达式的求值从右开始,然后向左进行。 因此,对于下面的代码- int a=1, b=2, c; c=a>b? a=a*2: a=a+3; cout<<c<<" "<<a;,c++,right-to-left,conditional-operator,associativity,left-to-right,C++,Right To Left,Conditional Operator,Associativity,Left To Right,但实际产出是有限的 4 4 我不明白这个关联性是如何工作的,因为从上面的输出来看,条件运算符似乎具有从左到右的关联性 关联性告诉您如果一行中有同一运算符的多个实例,会发生什么。比如说, f() - g() - h() c=a>b? a=a*2: a=a+3 解析为 (f() - g()) - h() a ? b : (c ? d : e) 而不是 f() - (g() - h()) 因为-是左关联的,而不是右关联的 所有这些都与求值顺序无关,求值顺序决定首先调用哪个函数 至于?
4 4
我不明白这个关联性是如何工作的,因为从上面的输出来看,条件运算符似乎具有从左到右的关联性 关联性告诉您如果一行中有同一运算符的多个实例,会发生什么。比如说,
f() - g() - h()
c=a>b? a=a*2: a=a+3
解析为
(f() - g()) - h()
a ? b : (c ? d : e)
而不是
f() - (g() - h())
因为-
是左关联的,而不是右关联的
所有这些都与求值顺序无关,求值顺序决定首先调用哪个函数
至于?:
是右关联的,它意味着
a ? b : c ? d : e
解析为
(f() - g()) - h()
a ? b : (c ? d : e)
(如果您将?…:
看作一个单独的操作符,那么这会稍微有点道理。)
但是,?:
保证从左到右求值:始终首先求值第一个操作数,然后正好求值其他操作数中的一个(取决于第一个结果的真值)
以你为例,
f() - g() - h()
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
,您为什么期望8
?两个分支中只有一个执行,而不是两个都执行,这意味着只有当(表达式中存在另一个具有相同优先级的运算器)否则不存在时,关联性规则才适用。