如何讀懂複雜的C宣告

2022-05-01 04:12:09 字數 2698 閱讀 5725

如何讀懂複雜的c宣告

k&r曾經承認:「c語言宣告的語法有時會帶來嚴重的問題」。的確,諸如 char * const * ( * next ) ( ) ;  char * ( * c[10]) ( int ** p );之類的宣告晦澀難懂,讓人迷茫。還好,peter van der linden在它的經典著作《expert c programming》中介紹了兩種解開這個難題的方法。

下面介紹讀懂c語言宣告兩法:

一、優先順序法。

a     宣告從它的名字開始讀取,然後按照優先順序順序依次讀取。

b     優先順序從高到低依次是:

b. 1     宣告中被括號括起來的部分

b. 2     字尾操作符:

括號 () 表示這是乙個函式

方括號   表示這是乙個陣列

b. 3     字首操作符:星號 * 表示 「指向...的指標」

c     如果const和(或)volatile關鍵字的後面緊跟型別說明符(如int,long等),那麼它作用於型別說明符。在其他情況下,const和(或)volatile關鍵字作用於它左邊緊鄰的指標星號。

舉例說明此法: char * const * (*next)();

a           首先,看變數名next,並注意到它直接被括號所括住

b.1        所以先把括號裡的東西看為乙個整體,得出「next是乙個指向...的指標」

b           然後考慮括號外的東西,在星號字首和括號字尾之間做出選擇

b.2        b.2規則告訴我們優先順序較高的是右邊的函式括號,所以得出「next是乙個函式指標,指向乙個返回...的函式」

b.3        然後,處理字首*,得出指標所指的內容

c          最後,把 char * const 解釋為指向字元的常量指標

概括分析之後,這個宣告表示:「next是乙個指標,它指向乙個函式,該函式返回另乙個指標,該指標指向乙個型別為char的常量指標」。

二、符號法。

步驟如下:

1、取最左邊的識別符號。

2、檢視識別符號右邊的下乙個符號,如果是方括號 [ ,則對於每一對,表示「...的陣列」

3、如果是左括號(,則到右括號為止的內容表示「返回...的函式」

4、如果左邊的符號是乙個左括號(,這個括號把已經處理的部分宣告組合在一起,直到遇見對應的右括號。然後從第2步重新開始。

5、如果左邊的符號是下述之一:

const    volatile    *

繼續向左讀取符號,知道所讀符號不再是上邊那三個之一。如果符號是const,表示「唯讀」,如果是volatile表示「volatile」,如果是*,表示「指向...的指標」然後重複第4步。

6、剩下的符號形成宣告的基本型別,剩餘的符號一併閱讀,如 static unsigned int

舉例說明此法:char * (* c[10] ) (int **p);

剩餘的宣告                           所採取的下一步驟                   結果

char * (* c[10])(int **p)                 第1步                              表示「c是...」

char * (*   [10])(int **p)                第2步                              匹配,表示「c是...的陣列」轉下一步

char * (*         )(int **p)                第3、4步                          不匹配,轉到下一步

char * (*         )(int **p)                第5步                               與星號匹配,表示「指向...的指標」,轉第4步

char * (           )(int **p)                第4步                               與「(」匹配,轉到第2步

char *              (int **p)                第2步                               不匹配,轉下一步

char *              (int **p)                第3步                               匹配,表示「返回...的函式,這個函式以int **p為引數」

char *                                           第4步                               不匹配,下一步

char *                                           第5步                               匹配,表示「指向...的指標」,剩下char,執行第6步

char                                              第6步                               直接閱讀

拼在一起,讀作:「c是乙個陣列,它的元素是指向函式的指標,該函式以int **p為引數,返回指向char的指標」。大功告成了!

事實上,以上的解析過程完全可以寫成乙個程式,用來解析c宣告,比如unix中的cdecl。

如何讀懂 C 語言複雜的宣告

如何讀懂 c 語言複雜的宣告 參考 雖說 c 語言相比於其他更高階的語言來講,有著非常精簡的語法結構,對於初學者非常的友好。然而,使用 c 語言依然可以可以寫出非常難懂的 也許這也就是精簡的語法所必須面對的缺點吧。筆者就經常一些複雜的宣告,看得一頭霧水,這裡就分享乙個幫你讀懂這些宣告的技巧吧。先自己...

如何分析複雜的C語言宣告

宣告從它的名字開始讀取,然後按照優先順序順序以此讀取 優先順序從高到低依次是 宣告中被括號擴起來的那部分 字尾操作符 字首引數操作符 如果const和volatile關鍵字的後面緊跟著型別說明符 如int,long 那麼 它作用於型別說明符.其他情況下,從const和volatile關鍵字作用於它左...

如何讀C 指標複雜宣告?

很多人都會被c 指標的複雜宣告搞混了。其實,讀c 指標宣告的過程,我們可以遵循2個原則 1 從名字開始,右 左 右 左 右這樣來讀 2 不斷對指標內容進行補完 對於指標,我們要知道指標的型別,知道了指標的型別也就是補完了 對於函式,我們要知道函式的引數和返回值,知道了也算是補完了 舉個例子 floa...