为什么不同的运营商有不同的关联性?

时间:2010-10-17 18:14:53

标签: language-agnostic programming-languages operators associativity

我已经进入了The Ruby Programming Language中关于运算符的部分,这让我想到了运算符关联性。顺便说一下,这不是一个Ruby问题 - 它适用于所有语言。

我知道操作员必须以某种方式关联,我可以看到为什么在某些情况下,一种方式会优于另一种方式,但我很难看到更大的图景。语言设计者是否有一些标准用来决定从左到右应该从哪里做什么?从右到左应该做什么?在某些情况下,它“只是有意义”,因为它只是一种方式而不是其他方式,而其他情况只是一种武断的决定?或者在这一切背后是否有一些宏伟的设计?

3 个答案:

答案 0 :(得分:7)

通常它的语法是“自然的”:

  • 考虑x - y + z。您希望它从左到右,以便获得(x - y) + z而不是x - (y + z)
  • 考虑a = b = c。您希望它从右向左,以便获得a = (b = c),而不是(a = b) = c

我无法想象一个选择似乎是“任意”的例子。

免责声明:我不知道Ruby,所以我上面的例子都基于C语法。但我确信同样的原则适用于Ruby。

答案 1 :(得分:4)

想象一下,用括号写下所有内容一两个世纪。 您将获得有关哪个运算符最有可能首先将其值绑定在一起以及哪个运算符最后绑定的经验。 如果您可以定义这些运算符的关联性,那么您希望以一种最简化括号的方式定义它,同时以易于阅读的术语编写公式。即(*)之前(+)和( - )应该是左关联的。

顺便说一句,左/右关联意味着与左/右递归相同。关联这个词是数学的视角,递归了算法。 (请参阅“end-recursive”,并查看您编写最多括号的位置。)

答案 2 :(得分:0)

comp sci中的大多数操作员关联性都直接来自数学。特别是符号逻辑和代数。