如何解讀c的宣告
2015-03-17 更新: ~~~~~~~~~~~~~~~~~
最近在看《C專家程式設計》, 結合《征服C指標》對上次的筆記做了一部分修改:
如何閱讀C的宣告?用英語閱讀 , 按照以下步驟:
1, 首先著眼於識別符號(變數名或者函式名)
2, 從距離識別符號最近的地方開始, 依照優先順序解釋派生型別(指標、陣列和函式).優先順序如下:
::
2.1 用於整理宣告內容的括弧 2.2 字尾操作符: 用於表示陣列的[], 用於表示函式的() 2.3 用於表示指標的*
3, 解釋完派生型別, 使用"of"、"to"、"returning"將他們連起來
4,最後, 追加資料型別修飾符(在左邊, int, double等), 對於const關鍵字,
如果右邊緊跟型別修飾符(如int, double等), 則它作用於型別修飾符,
否則作用於左邊緊鄰的\*
\ 指標星號, 並且雖然const意思是常量,
把它解讀為\read-only
\ 才更加正確
5,英語不好的人, 可以倒序用中文解釋
注意讀完一部分就把那一部分換成()忽略掉.
比如:
.. code:: c
int (*func_p)(double);
1, 首先著眼於識別符號.那就是func_p :func_p is
2, 因為有括號, 所以先著眼於, 那就是
\ func_p:func_p is pointer to
3, 解釋用於函式的(), 引數是double, 那就是 (*func_p)(double) :func_p is pointer to function(double) returning
4, 最後, 解釋資料型別修飾符 int, 那就是 int (*func_p)(double) :fun_p is pointer to function(double) returning int
5, 翻譯成中文:func_p 是指向返回型別為int的函式的指標
;p 怎麼樣, 這方法很有效吧?
再來一個例子:
.. code:: c
char * const *(*next)();
1, 首先我們著眼於next, 英文是"next is ";
2, next在括號內, 右邊既沒有\[]
\ 也沒有\()
, 左邊有\*
,
所以英文是"next is a pointer to";
3, 接下來上面的式子變成了這個\char *const *()()
, 我們繼續解讀,
()右邊還有 (), 所以是一個函式, 函式沒有形參: "next is a ponter to a
function(which has no arguments)";
4, 上面讀完以後左邊有一個\*
, 所以應該繼續解讀為 "next is a pointer
to a function(which has no arguments), and the function return a pointer
to";
5, 完成上面一步, 原來的語句就變成了\char * const ()
,
接下來按照規則, const右邊沒有型別修飾符, 所以const修飾的是左邊的星號:
"next ... , and the function return a pointer to a read-only pointer";
6, 這下式子已經很簡單了, 可謂是"司馬昭之心, 路人皆知"(誒?好像有點不對?)char ()
, 所以最終解讀為 " next ..., and the function return a
pointer to a read-only pointer who's type is char";
7, 翻譯成中文: next是一個指標, 它指向一個函式, 函式返回另一個指標, 該指標指向一個型別為char的只讀指標(其中函式沒有引數).
2014-10-17:
別人翻譯的《征服C指標web版》: `點我 <http://avnpc.com/pages/c-pointer>`__ 2015-03-17:
征服C指標 <http://www.amazon.cn/%E5%9B%BE%E7%81%B5%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E4%B8%9B%E4%B9%A6-%E5%BE%81%E6%9C%8DC%E6%8C%87%E9%92%88-%E5%89%8D%E6%A1%A5%E5%92%8C%E5%BC%A5/dp/B00BKU37NG/ref=sr_1_1?ie=UTF8&qid=1426599089&sr=8-1&keywords=%E5%BE%81%E6%9C%8Dc%E6%8C%87%E9%92%88>
__
C專家程式設計 <http://www.amazon.cn/C%E4%B8%93%E5%AE%B6%E7%BC%96%E7%A8%8B-%E8%8C%83%E5%BE%B7%E6%9E%97%E7%99%BB/dp/B00BHSPPDQ/ref=sr_1_1?ie=UTF8&qid=1426599140&sr=8-1&keywords=c%E4%B8%93%E5%AE%B6%E7%BC%96%E7%A8%8B+%E8%8B%B1%E6%96%87%E7%89%88>
__
(english version)