標籤:

*a.b()是什麼意思,運算符順序是怎麼看的?


http://en.cppreference.com/w/c/language/operator_precedence

http://en.cppreference.com/w/cpp/language/operator_precedence

以無參數調用 a 的 b 成員,將結果解引用。

為了避免對運算符優先順序的記憶出錯,寫成 *(a.b()) 比較好。


@暮無井見鈴 已經給出標準答案了。我來說一下我是怎麼「猜」對的:

先看「*a.b」。C 語言中還有一個運算符「-&>」,「a-&>b」表示「(*a).b」。

如果「*a.b」是先算星號,後算點,那麼「-&>」這個運算符的意義就不大了 ——「a-&>b」和「*a.b」一樣都是四個字元。(當然,在「a-&>b-&>c」這種一連串「-&>」的情形下還是有用的)

由此,我推測「*a.b」是先算點,後算星號

而原題的「*a.b()」,顯然不可能先算括弧,問題就是括弧是在星號之前還是之後算的。

如果是按「點 - 星號 - 括弧」的順序,那麼 a.b 應該是一個函數指針,這個東西沒那麼常用。而且從 a 的角度來看,運算順序一會兒向右,一會兒向左,很彆扭。

如果是按「點 - 括弧 - 星號」的順序,那麼 a.b 是一個返回指針的函數,這個東西很常見。同時從 a 的角度來看,運算順序是先向右後向左,還算正常。

我的這個猜測過程可以用來輔助記憶。


後綴單目運算優先,先從左到右算後綴,再從右到左算前綴,所以順序是:. () *


1. a.b

2. a.b()

3. *a.b()

不只限於 C/C++,成員運算符(小點)在絕大多數編程語言中具有最高的優先順序。因為以下寫法都很常見用:-a.num、a.field、*a.num + 3。

函數調用的優先順序也很高,通常僅次於小點。否則 - fun() 這種寫法會有問題。

再之後是一系列單目運算符,雙目運算符優先順序通常比單目運算符低。

運算符的設計是為了便於肉眼 Parser 代碼,通常看上去最符合直覺的順序都是對的。但有時候一堆加減乘除位運算放一起,老實加括弧吧。


按照一般的parser書寫,. 和()以及[]都是trailer,是atom上的東西。而*是運算符了。


我選擇加括弧


假設 cpp語言,意思就是 對象 a 調用 成員函數 b(),該函數返回的是一個指針,就這麼多。不明白哪裡有問題需要問。


指針對象的b方法


推薦閱讀:

CS、360、這些軟體的根目錄下有很多不同類型的文件。在沒有VS、JDK這些「程序設計語言」的「支持?
能不能用c#和c/c++以及其他語言寫一個完整的IDE(類似visual studio)?
圖中的最長路徑問題怎麼算?
為什麼X86的寄存器數量沒有隨著性能的提升而增加?
為什麼要有指針?

TAG:C編程語言 | C | CC |