运营商的关联性是什么,为什么重要?


87

什么是关联性(对于操作员而言),为什么重要?

更新:操作员关联


2
什么样的关联性?操作员关联性?
伊克

26
@Neil Butterworth-对于似乎合理的问题,这是特别苛刻的评论。该站点的重点是要成为所有编程知识(包括介绍性文字中涵盖的内容)的中央存储库。至于您对@Jian Lin回答他自己的评论的评论,正如官方常见问题解答的第一个问题中所述,这也是可以接受的。具有您的销售代表水平的人应该更了解。如果您不同意它,至少对此要保持文明。
罗布·艾伦

1
@Rob Allen参见他的其他文章。另外,我不是说他不应该回答自己的帖子,只是说这没有帮助。而且,我会帮您达成交易-如果您不告诉我该如何表达我的话,我不会告诉您如何在此处表达您的帖子。

Answers:


105

对于运算符,关联性意味着当同一运算符连续出现时,则首先应用哪个运算符。在下面,让我们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

您是否知道如何找到给定语法的联想性?
user2510115 2013年

1
例如expr -> expr + term;,左联想和expr -> term + expr右联想。
Subin Sebastian 2014年

15
在答案的第一行中,与其说“当出现相同的运算符时”,不如说“当出现相同优先级的运算符时”。示例:a * b / c =>其中*和/具有相同的优先级。
2014年

2
@ 1O1,但是,如果那些优先级相同的运算符具有不同的关联性,会发生什么?如何a * b / c评估*左联想但/右联想呢?然后有一个矛盾。因此,我认为如果要涵盖多个运算符,则需要说“优先级和关联性相同的运算符时”。
Johannes Schaub-litb

2
@Mark我不知道,但是我无法考虑它应该如何工作。可能值得一个额外的stackoverflow问题
Johannes Schaub-litb

13

有三种关联性:

数学的关联性质

编程语言的操作顺序

CPU缓存中的关联性。

数学中的关联属性是运算符的属性,例如加法(+)。此属性使您可以重新排列括号而无需更改语句的值,即:

(a + b) + c = a + (b + c)

在编程语言中,运算符的关联性(或固定性)是一种属性,它确定在没有括号的情况下如何将具有相同优先级的运算符分组。即每个操作员的评估顺序。这在编程语言之间可能有所不同。

在CPU缓存中,关联性是一种优化性能的方法。


3
运算符的关联性(或固定性)是一种属性,它确定在没有括号的情况下如何将具有相同优先级的运算符进行分组-该短语恰好使我理解
Rafael Eyng

7

简单!!

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
答案似乎有误:2 % 5计算结果为2,而不是0
6005

5

如果您指的是“运算符关联性”,这是一种语言如何确定在没有括号的情况下如何对具有相同优先级的运算符进行分组。

例如,基于C的语言中的+和-运算符具有相同的优先级。当您编写使用这两个表达式的表达式(不带括号)时,编译器必须确定对它们进行评估的顺序。

如果您写12-5 + 3,则可能的评估包括:

  1. (12-5)+ 3 = 10
  2. 12-(5 + 3)= 4

根据您对表达式求值的顺序,可以获得不同的结果。在基于C的语言中,+和-保留了关联性,这意味着上面的表达式将作为第一种情况求值。

所有语言对于优先级和关联性都有严格定义的规则。您可以在此处了解有关C#规则的更多信息。维基百科充分介绍了操作员关联性优先级的一般概念。


如果它们都使用相同的操作数,则示例将更加清晰。
迈克尔·卡曼

如果两个具有相同优先级的运算符出现在不带括号的表达式中,但是其中一个保留了联想性,而另一个保留了正确性,会发生什么呢?它会仅使用它首先找到的哪个运算符的关联性吗?
赫克托

它不可能发生,因为相同的优先顺序意味着相同的关联性。如果不是这样,那么案头可能会模糊不清,威胁到现实的存在。
Ankur S

5

这是优先级相同的运算符的求值顺序。左移或右移命令很重要。对于

3 - 2 - 1

如果从左到右,则为

(3 - 2) - 1

并且为0。如果它是RIGHT LEFT LEFT,那么它是

3 - (2 - 1)

它是2。在大多数语言中,我们说减号运算符具有从左到右的关联性。

2020年更新:

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


4
如果您已经知道答案,那么为什么要问这个问题?
罗伯特·哈维

6
是为了帮助新朋友。我记得很久以前学习过C,直到后来才知道真正的关联性。
极性2009年

3
我怀疑大多数学习C的人都可以在没有您“帮助”的情况下完成。

1
hm,例如,关联性是限于同一运算符,还是对于相同优先级的运算符?如果不检查书籍或参考资料,许多人可以肯定地回答吗?
极性2009年

13
@Neil Butterworth,为什么这么敌对?我认为发布您自己问题的答案是可以接受的。这是在FAQ中,并且在播客中已多次提及。
杰·康罗德

3

我假设您的意思是操作员关联性...

这是将操作数绑定到运算符的顺序。基本上:

a-b + c

可能被评估为(假设-和+具有相同的优先级):

(((a-b)+ c)或
((a-(b + c)))

如果运算符保持左键关联(立即绑定到左操作数),它将被视为第一个。如果它们是正确的关联,它将被评估为第二。


1

如果您是指操作员关联性:

它定义了解析表达式的方式。它提供了一个标准,因此每个表达式都以相同的方式进行解析。

对于具有相同先例的操作,这可能会产生副作用,这是最重要的。


0

前面的大多数示例都使用了常量。如果参数碰巧是函数调用,则调用的顺序可能由关联规则确定,具体取决于编译器。如果这些功能有副作用..


0

我们都知道,优先级很重要,但在解释表达式的含义时,关联性也很重要。对于一个非常简单的介绍,请尝试使用运算符Power


0

关联性在编程语言概念中处于计算的顺序之下。计算顺序决定了表达式的含义。它有两个主要规则,

  1. 优先规则
  2. 关联规则

优先规则定义了评估不同类型的“相邻”运算符的顺序。每种编程语言都有关于其运算符的自己的运算符优先级表。

回到联想,

它定义具有相同优先级的相邻操作的执行顺序。它有3种口味

左结合性
右结合性
非结合性

如果运算符是左关联的,则从左到右进行评估,如果运算符是右关联的,则从右到左进行评估。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.