什么是关联性(对于操作员而言),为什么重要?
更新:操作员关联
什么是关联性(对于操作员而言),为什么重要?
更新:操作员关联
Answers:
对于运算符,关联性意味着当同一运算符连续出现时,则首先应用哪个运算符。在下面,让我们Q
成为运算符
a Q b Q c
如果Q
保持关联,则其评估为
(a Q b) Q c
如果它是正确的关联,则其评估为
a Q (b Q c)
这很重要,因为它会更改表达式的含义。考虑整数运算的除法运算符
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
如果它是正确的关联,它将计算为一个未定义的表达式,因为您将被零除
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
,左联想和expr -> term + expr
右联想。
a * b / c
评估*
左联想但/
右联想呢?然后有一个矛盾。因此,我认为如果要涵盖多个运算符,则需要说“优先级和关联性相同的运算符时”。
有三种关联性:
数学中的关联属性是运算符的属性,例如加法(+)。此属性使您可以重新排列括号而无需更改语句的值,即:
(a + b) + c = a + (b + c)
在编程语言中,运算符的关联性(或固定性)是一种属性,它确定在没有括号的情况下如何将具有相同优先级的运算符分组。即每个操作员的评估顺序。这在编程语言之间可能有所不同。
在CPU缓存中,关联性是一种优化性能的方法。
简单!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
我们知道*,/和%具有相同的优先级,但是根据关联性,答案可能会改变:
例如:我们有表达式:4 * 8/2%5
Left associative: (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1
Right associative: 4 * 8 /(2 % 5) ==> 4 * ( 8 / 2) ==> 4 * 4 ==> 16
2 % 5
计算结果为2
,而不是0
。
如果您指的是“运算符关联性”,这是一种语言如何确定在没有括号的情况下如何对具有相同优先级的运算符进行分组。
例如,基于C的语言中的+和-运算符具有相同的优先级。当您编写使用这两个表达式的表达式(不带括号)时,编译器必须确定对它们进行评估的顺序。
如果您写12-5 + 3,则可能的评估包括:
根据您对表达式求值的顺序,可以获得不同的结果。在基于C的语言中,+和-保留了关联性,这意味着上面的表达式将作为第一种情况求值。
所有语言对于优先级和关联性都有严格定义的规则。您可以在此处了解有关C#规则的更多信息。维基百科充分介绍了操作员关联性和优先级的一般概念。
这是优先级相同的运算符的求值顺序。左移或右移命令很重要。对于
3 - 2 - 1
如果从左到右,则为
(3 - 2) - 1
并且为0。如果它是RIGHT LEFT LEFT,那么它是
3 - (2 - 1)
它是2。在大多数语言中,我们说减号运算符具有从左到右的关联性。
3 - 2 - 1
如果声称是“当然,我们从左到右做到这一点”,那么这种情况似乎就显得微不足道。但是在其他情况下,例如在Ruby或NodeJS中完成:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
的**
是“给力”操作符。关联性是从右到左。这是
2 ** (3 ** 2)
其是2 ** 9
,即,512
代替,
(2 ** 3) ** 2
即8 ** 2
,即64
。
我假设您的意思是操作员关联性...
这是将操作数绑定到运算符的顺序。基本上:
a-b + c
可能被评估为(假设-和+具有相同的优先级):
(((a-b)+ c)或
((a-(b + c)))
如果运算符保持左键关联(立即绑定到左操作数),它将被视为第一个。如果它们是正确的关联,它将被评估为第二。
我们都知道,优先级很重要,但在解释表达式的含义时,关联性也很重要。对于一个非常简单的介绍,请尝试使用运算符Power。
关联性在编程语言概念中处于计算的顺序之下。计算顺序决定了表达式的含义。它有两个主要规则,
- 优先规则
- 关联规则
优先规则定义了评估不同类型的“相邻”运算符的顺序。每种编程语言都有关于其运算符的自己的运算符优先级表。
回到联想,
它定义具有相同优先级的相邻操作的执行顺序。它有3种口味
左结合性
右结合性
非结合性
如果运算符是左关联的,则从左到右进行评估,如果运算符是右关联的,则从右到左进行评估。