2012-01-30 103 views
9

我在写一个脚本语言的过程中,我想复制(得很好标准化)C order of operations.C语言中从右到左和从左到右的关联性的后果是什么?

一两件事,我从来没有作为一个正式的概念,虽然是关联牢牢把握。为什么某些运营商组从左到右和其他从右到左?

能有人给我如何的代码行可能看起来不同,如果规则都是几个例子左向右或他们的正好相反?或者为什么联想性是这样的,因为在我看来,这是一种任意的选择,但我认为他们有一个理由。

而且,只是要注意,我不知道什么关联性的手段,我不能想到哪里左到右(反之亦然)的任何实例比其他选择

+0

这是一个如此辉煌的问题!另请参阅[为什么这样做 - 分配运算符 - 分配到左手边](http://programmers.stackexchange.com/questions/98406/why-does-the-assignment-operator-分配到左手边) – nawfal 2013-10-11 06:32:45

回答

13

在大多数情况下,每个操作员,使得对于操作者最有意义的关联性。

所有非赋值二元运算符都具有从左到右的关联性。这很有用,原因很简单,因为英文是从左到右阅读,因此x + y + z的评估与阅读方式是一致的。另外,对于算术运算符,语义与我们在数学中对操作符的使用所期望的相符。

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

前缀一元运算符具有从右到左结合,这是有意义的,因为最接近于操作数的运算符首先评价,所以在~!x!x首先计算,然后~被施加到的结果。这将是真的,真的奇怪的前缀运算符应用与从左到右的关联性:说~!x意味着评估~x,然后应用!结果是完全相反,我们如何思考表达式(或至少,大多数人如何看待表情......)。

+1

在C中,赋值运算符的从左到右的关联性会使'x = y = z'成为一个错误(出于同样的原因,“(x = y)= z'是一个错误)。 – caf 2012-01-30 04:05:16

+0

@caf:是的,但如果考虑更改运算符的关联性,还可以考虑更改运算符表达式的值类别。 – 2012-01-30 16:12:45

0

累计舍入更好通常是答案。

然而,>>和< <必须是他们的方式或结构,如12 < < 2 >> 3不起作用。

6

例子:

5 - 4 - 3 
(5 - 4) - 3 = -2 // left association is correct 
5 - (4 - 3) = 4 // right is incorrect 

a == b == c // What does this equal? 
      // It is common to have == be non-associative because of this. 

x = y = z 
x = (y = z) // right association is correct, sets x and y 
(x = y) = z // left is incorrect, does not set y 

大多数运营商继承数学的关联性。按位可以看作是算术运算符,因此具有相关性。

一元是正确的关联,因为这组这样:

~!-x = ~(!(-(x))) 

另一个方法是没有多大意义,除非后缀。

+1

我不喜欢非关联性。在我看来,'a == b == c'应该表示为'(a == b)== c'(比较'a == b'到'c'的布尔结果)或者是特殊的在(a == b')&&(b'== c)'中给Python'let b'= b。 – 2012-02-02 01:33:09

2

棘手的运算符是指数运算(例如:**在python中,^在R中,haskell)。大多数语言,解析器等将3 ** 3 ** 3视为3 ** (3 ** 3)。我个人认为这是正确的解释,但最近发现,倍频程和matlab计算这个为(3 ** 3) ** 3

这不是C中的问题,因为它没有指数运算符。相反,您拨打pow函数并且必须明确说明pow(3,pow(3,3))pow(pow(3,3),3)

+2

在Cobol中以及在Fortran中也是正确的联合:http://www.fortran.com/F77_std/rjcnf0001-sh-6.html。从数学上讲,这是正确的解释。 – EJP 2012-02-10 01:19:46

相关问题