操作符結合性的作用

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

1.    每個操作符擁有某一級別的優先級,同時也擁有左結合性或右結合性。優先級決定一個不含括號的表達式中操作數之間的“緊密”程度。

例如,在表達式a*b+c中,乘法運算的優先級高於加法運算符的優先級,所以先執行乘法a*b,而不是加法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。類似地,具有左結合性的操作符(如位操作符“&”和“|”)則是從左至右依次執行。

    所以,遇到一個表達式時,先根據運算符的優先級將表達式拆分成幾個子表達式,然後在每個子表達式中根據運算符的結合性來進一步確定執行的順序。

    【特殊情況】 看下面這個C表達式:

        a+++b;

    結果是(a++)+b還是a+(++b)呢?答案是前者,因爲在遇到這種情況時,C編譯器會將表達式按照從左往右的順序儘量匹配出一個子表達式,所以當C編譯器遇到a且後面有3個+號時,會首先嚐試匹配a+++,當然這是沒有意義的,所以接着嘗試a++發現這是有意義的匹配,因此確定a++爲第一個子表達式,然後再接着匹配+號和b。因此結果是(a++)+b。

2.    這種情況不能算是上面所討論的運算符優先級和結合性的特例,因爲它發生在優先級和結合性判斷之前,但確實具有一些迷惑性,所以建議在遇到這種情況時給其加上括號,以增加可讀性且避免可能發生的不必要的錯誤。

發佈了43 篇原創文章 · 獲贊 15 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章