天天看點

c語言的左結合性與右結合性

右結合性,就是在表達式中最右邊的操作最先執行,然後從右到左依次執行

左結合性的操作符(如位操作符“&”和“|”)則是從左至右依次執行

在标準C語言的文檔裡,對操作符的結合性并沒有做出非常清楚的解釋。一個滿分的回答是:它是仲裁者,在幾個操作符具有相同的優先級時決定先執行哪一個。

每個操作符擁有某一級别的優先級,同時也擁有左結合性或右結合性。優先級決定一個不含括号的表達式中操作數之間的“緊密”程度。例如,在表達式ab+c中,乘法運算的優先級高于加法運算符的優先級,是以先執行乘法ab,而不是加法b+c。

但是,許多操作符的優先級都是相同的。這時,操作符的結合性就開始發揮作用了。在表達式中如果有幾個優先級相同的操作符,結合性就起仲裁的作用,由它決定哪個操作符先執行。像下面這個表達式:

int a,b=1,c=2;

a=b=c;

我們發現,這個表達式隻有指派符,這樣優先級就無法幫助我們決定哪個操作先執行,是先執行b=c呢?還是先執行a=b。如果按前者,a=結果為2,如果按後者,a的結果為1。

所有的指派符(包括複合指派)都具有右結合性,就是在表達式中最右邊的操作最先執行,然後從右到左依次執行。這樣,c先指派給b,然後b在指派給a,最終a的值是2。類似地,具有左結合性的操作符(如位操作符“&”和“|”)則是從左至右依次執行。

結合性隻用于表達式中出現兩個以上相同優先級的操作符的情況,用于消除歧義。事實上你會注意到所有優先級相同的操作符,它們的結合性也相同。這是必須如此的,否則結合性依然無法消除歧義,如果在計算表達式的值時需要考慮結合性,那麼最好把這個表達式一分為二或者使用括号。

例:

a=b+c+d

=是右結合的,是以先計算(b+c+d),然後再指派給a

+是左結合的,是以先計算(b+c),然後再計算(b+c)+d

C語言中具有右結合性的運算符包括所有單目運算符(~取反、!取非、-負号、+正号、++自增、–自減)以及指派運算符(=)和條件運算符(?:)。其它運算符都是左結合性。

在C語言中有少數運算符在C語言标準中是有規定表達式求值的順序的:

1:&& 和 || 規定從左到右求值,并且在能确定整個表達式的值的時候就會停止,也就是常說的短路。

2:條件表達式的求值順序是這樣規定的:

test ? exp1 : exp2;

條件測試部分test非零,表達式exp1被求值,否則表達式exp2被求值,并且保證exp1和exp2兩者之中隻有一個被求值。

3:逗号運算符的求值順序是從左到右順序求值,并且整個表達式的值等于最後一個表達式的值,注意逗号’,'還可以作為函數參數的分隔符,變量定義的分隔符等,這時候表達式的求值順序是沒有規定的!

判斷表達式計算順序時,先按優先級高的先計算,優先級低的後計算,當優先級相同時再按結合性,或從左至右順序計算,或從右至左順序計算。

轉自:http://tieba.baidu.com/p/3781601455

繼續閱讀