什么是运营商的相关性以及为什么重要?

nop*_*ole 80 associativity

什么是关联性(对于运营商)以及为什么重要?

更新:操作员关联性

Joh*_*itb 92

对于运算符,关联性意味着当同一个运算符出现在一行中时,我们首先应用哪个运算符出现.在下面,让我们Q成为运营商

a Q b Q c
Run Code Online (Sandbox Code Playgroud)

如果Q是左关联的,那么它的计算结果为

(a Q b) Q c
Run Code Online (Sandbox Code Playgroud)

如果它是正确的关联,那么它的评估为

a Q (b Q c)
Run Code Online (Sandbox Code Playgroud)

这很重要,因为它改变了表达式的含义.考虑具有整数运算的除法运算符,它是左关联的

4 / 2 / 3    <=>    (4 / 2) / 3    <=> 2 / 3     = 0
Run Code Online (Sandbox Code Playgroud)

如果它是右关联的,它将评估为未定义的表达式,因为您将除以零

4 / 2 / 3    <=>    4 / (2 / 3)    <=> 4 / 0     = undefined
Run Code Online (Sandbox Code Playgroud)

  • 在答案的第一行,而不是"当出现相同的运算符时",更适合说"何时出现相同优先级的运算符".示例:a*b/c =>其中*和/具有相同的优先级. (12认同)
  • 例如,“expr -&gt; expr + term;”是左关联,“expr -&gt; term + expr”是右关联。 (2认同)
  • @1O1 谢谢,但是如果那些具有相同优先级的运算符具有不同的结合性会发生什么?`a * b / c` 将如何评估 `*` 是左结合而 `/` 是右结合吗?然后就有了矛盾。因此,我认为如果您想涵盖多个运算符,则需要说“当运算符具有相同的优先级和结合性时”。 (2认同)
  • @Mark 我不知道,但我想不出它应该如何工作。可能值得一个额外的stackoverflow问题 (2认同)

Rob*_*vey 12

有三种相关性:

数学中的联想属性

编程语言中的操作顺序

CPU缓存中的相关性.

数学中的关联属性是运算符的属性,例如加法(+).此属性允许您重新排列括号而不更改语句的值,即:

(a + b) + c = a + (b + c)
Run Code Online (Sandbox Code Playgroud)

在编程语言中,运算符的关联性(或固定性)是一种属性,用于确定在没有括号的情况下如何对相同优先级的运算符进行分组; 即每个操作员的评估顺序.这可能因编程语言而异.

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

  • *运算符的关联性(或固定性)是一种属性,它确定在没有括号的情况下如何将具有相同优先级的运算符进行分组*-该短语非常适合让我理解 (2认同)

Dee*_*pak 8

简单的!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 
Run Code Online (Sandbox Code Playgroud)

我们知道 *、/ 和 % 具有相同的优先级,但根据关联性,答案可能会改变:

例如:我们有表达式: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
Run Code Online (Sandbox Code Playgroud)

  • 答案中似乎有一个错误:“2 % 5”的计算结果为“2”,而不是“0”。 (2认同)

Meh*_*ari 6

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

a - b + c

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

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

如果运算符是左关联的(立即绑定到左操作数),它将被评估为第一个。如果它们是右结合的,则将其计算为第二个。


nop*_*ole 6

它是相同优先级的运算符的求值顺序.左下或右下订单事宜.对于

3 - 2 - 1
Run Code Online (Sandbox Code Playgroud)

如果是左至右,那么它是

(3 - 2) - 1
Run Code Online (Sandbox Code Playgroud)

并且是0.如果它是左对,那么它是

3 - (2 - 1)
Run Code Online (Sandbox Code Playgroud)

它是2.在大多数语言中,我们说减号运算符具有左向右相关性.

  • @Neil Butterworth,为何如此敌视?我认为发布自己问题的答案是可以接受的.这是在常见问题解答中,并且已在播客中多次提及. (13认同)
  • 这是为了帮助新人.我记得很久以前就学过C,直到后来才知道结果是什么. (6认同)
  • 如果你已经知道答案,那你为什么问这个问题呢? (3认同)
  • 我怀疑大多数学习C的人都可以没有你的"帮助". (3认同)

LBu*_*kin 5

如果您指的是"运算符关联性" - 它是一种语言如何确定在没有括号的情况下如何对相同优先级的运算符进行分组.

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

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

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

根据您评估表达式的顺序,您可以获得不同的结果.在基于C语言中,+和 - 具有左关联性,这意味着上面的表达式将作为第一种情况进行评估.

所有语言都有强烈定义的优先级和关联性规则.您可以在此处了解有关C#规则的更多信息.维基百科上很好地涵盖了运算符关联性优先级的一般概念.