2012-01-30 55 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

相關問題