在基于C的语言中,从右到左和从左到右的关联性会产生什么影响?

Ear*_*rlz 9 c syntax language-design operators operator-precedence

我正在编写脚本语言,我想复制(非常标准化的)C操作顺序.

有一件事,我从来没有牢牢把握作为一个正式的概念,虽然是相关性.为什么一些操作员组从左到右,其他从右到左?

有人可以给我一些例子,说明如果规则是从左到右或与它们相反的话,一行代码看起来会有什么不同?或者为什么关联性是它的方式,因为在我看来它只是一个随意的选择,但我认为他们有理由.

另外,请注意,我确实知道关联性意味着什么,我只是想不出任何从左到右(或反之亦然)优于其他选择的例子

Jam*_*lis 13

在大多数情况下,每个运算符都具有对该运算符最有意义的关联性.

所有非赋值二元运算符都具有从左到右的关联性.这对于从左到右阅读英语的明显原因很有用,因此评估x + y + z与阅读方式一致.此外,对于算术运算符,语义符合我们对数学运算符的使用期望.

赋值运算符具有从右到左的关联性.从左到右的赋值将具有奇怪和意外的语义.例如,x = y = z将导致x具有原始值yy具有原始值z.在表达式完成后,预计所有三个变量将具有相同的值.

前缀元运算符具有从右到左的结合,这是有意义的,因为最接近操作数的运算符最先求,所以~!x,!x先计算,然后~应用到结果.前缀运算符应用从左到右的关联性真的非常奇怪:说这~!x意味着评估~x然后应用!到结果与我们对表达的思考方式完全相反(或者,至少,大多数人的想法)关于表达式......).


Pub*_*bby 6

例子:

5 - 4 - 3
(5 - 4) - 3 = -2 // left association is correct
5 - (4 - 3) = 4  // right is incorrect
Run Code Online (Sandbox Code Playgroud)
a == b == c // What does this equal?
            // It is common to have == be non-associative because of this.
Run Code Online (Sandbox Code Playgroud)
x = y = z
x = (y = z) // right association is correct, sets x and y
(x = y) = z // left is incorrect, does not set y
Run Code Online (Sandbox Code Playgroud)

大多数操作员从数学继承他们的相关性.按位可以被视为算术运算符,因此具有左相关性.

一元是正确的关联,因为它以这种方式分组:

~!-x = ~(!(-(x))) 
Run Code Online (Sandbox Code Playgroud)

除非后缀,否则另一种方式没有多大意义.