什么是关联性(对于操作员),为什么它很重要?
更新:运算符关联性
对于运算符,关联性意味着当同一运算符连续出现时,我们首先应用哪个运算符出现。在下面,让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
关联性分为三种:
数学中的关联属性是运算符的属性,例如加法 (+)。此属性允许您在不更改语句值的情况下重新排列括号,即:
(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
它是相同优先级的运算符的求值顺序。从左到右或从右到左的顺序很重要。为了
3 - 2 - 1
如果它是从左到右,那么它是
(3 - 2) - 1
并且是 0。如果它是 RIGHT 到 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
.
如果您指的是“运算符关联性” - 它是一种语言如何确定相同优先级的运算符在没有括号的情况下如何分组。
例如,基于 C 语言的 + 和 - 运算符具有相同的优先级。当您编写一个同时使用它们(不带括号)的表达式时,编译器必须确定以什么顺序评估它们。
如果你写 12 - 5 + 3,可能的评估包括:
根据您评估表达式的顺序,您可以获得不同的结果。在基于 C 的语言中,+ 和 - 具有左结合性,这意味着上面的表达式将作为第一种情况进行计算。
所有语言对优先级和关联性都有严格定义的规则。您可以在此处了解有关C#规则的更多信息。操作符关联性和优先级的一般概念在维基百科中有很好的介绍。
我假设您的意思是运算符关联性...
这是将操作数绑定到运算符的顺序。基本上:
a - b + c
可能被评估为(假设 - 和 + 具有相同的优先级):
((a - b) + c) 或
(a - (b + c))
如果运算符是左关联的(立即绑定到左操作数),它将被评估为第一个。如果它们是右结合的,它将被评估为第二个。
如果您的意思是运算符关联性:
它定义了解析表达式的方式。它提供了一个标准,因此每个表达式都以相同的方式解析。
当可能存在副作用时,这对于具有相同优先级的操作最为重要。
前面的大多数示例都使用了常量。如果参数恰好是函数调用,则调用的顺序可能由关联规则确定,当然这取决于您的编译器。如果这些功能有副作用..
我们都知道优先级很重要,但解释表达式含义时的关联性也很重要。对于一个非常简单的介绍,请尝试Power of Operators。
关联性属于编程语言概念中的计算顺序。计算顺序决定了表达式的含义。它有两个主要规则,
- 优先规则
- 关联规则
优先规则定义了评估不同类型的“相邻”运算符的顺序。每种编程语言都有关于其运算符的自己的运算符优先级表。
回到关联性,
它定义了具有相同优先级的相邻操作的执行顺序。它有3种口味,
左结合性
右结合性
非结合性
如果一个运算符是左结合的,它从左到右求值,同样,如果它是右结合的,它从右到左求值。