如何讀懂 c 語言複雜的宣告
參考《雖說 c 語言相比於其他更高階的語言來講,有著非常精簡的語法結構,對於初學者非常的友好。 然而,使用 c 語言依然可以可以寫出非常難懂的**, 也許這也就是精簡的語法所必須面對的缺點吧。 筆者就經常一些複雜的宣告,看得一頭霧水,這裡就分享乙個幫你讀懂這些宣告的技巧吧。例1:先自己測試一下, 如下的宣告你能讀懂嗎?
要讀懂乙個宣告,必須要懂得其中的優先順序規則。void (*signal(int sig, void(*func)(int))) (int); // 當然,比這個複雜的宣告還有很多...
優先順序規則如下:
a: 宣告從它的名字開始讀起, 然後按照優先順序順序依次讀取
b: 優先順序從高到低依次是:
b.1: 宣告中括號括起來的部分
b.2: 字尾操作符:
括號 () 表示這是乙個函式
方括號 表示這是乙個陣列
b.3: 字首操作符: 星號 * 表示 「指向…的指標」
c: 如果 const 和 ( 或 ) volatile 關鍵字的後邊緊跟型別說明符(如 long 等), 那麼它作用於型別說明符。
在其他情況下,const 和 ( 或 ) volatile 關鍵字作用於它左邊緊鄰的指標星號
char * const *(*next)();
首先,變數名為 next
這裡優先順序最高的就是括號了。 括號中 \*next 為乙個整體,具有最高優先順序。 由 b.3 可以得知 "next 是乙個指向 ... 的指標"
除括號外,最高優先順序為字尾操作符,這裡有括號緊跟著 (\*next)。 由 b.2 可知 "next 是乙個函式指標,被指向的函式沒有輸入引數, 返回值還需要進一步分析"
接下來最高優先順序的結構應該是 (\*next) 的字首操作符------星號\*。 這裡需要進一步分析更前面的結構
最後,我們應該將 "char \* const \*" 解釋為乙個結構。 由 c 可知它的意義為 "指向字元的常量指標"
總結,這個宣告的含義為:next 是乙個函式指標, 該函式指標指向的函式無輸入引數且返回乙個指向字元的常量指標
例2:
void (*signal(int sig, void(*func)(int))) (int); // 當然,比這個複雜的宣告還有很多...
這就是我們前面提到的宣告,我們來試著分析一下。
首先,變數名是 signal
其次就是括號了。 括號中 (\*signal(int sig, void(\*func)(int))) 為乙個整體。 signal 前有星號,它的意義是 "signal 是乙個指向 ... 的指標"
接著 signal 後有括號,標誌著 signal 是乙個函式指標,它有一些複雜的引數和不易分析的返回值。
signal 函式指標指向的函式具有兩個引數, 乙個是 int sig, 乙個是 void(\*func)(int)。
void(\*func)(int) 表示乙個函式指標,被指向的函式接收乙個 int 引數返回值為 void。
接著就是最後的那個 (int), 它和最前面的 void 一起表示 signal 指向的函式返回乙個函式指標。 後者所指向的函式接受乙個 int 引數並返回 void.
總結, 這個宣告的含義為:signal 是乙個函式指標,它返回乙個接收乙個 int 引數並返回 void 的函式指標。而 signal 函式接收乙個 int 和乙個函式指標作為引數。 第二個引數所指向的函式接收乙個 int 引數並返回 void
哈哈,其實我想說,即使我們分析清楚了這個宣告的意義,它依舊像魔鬼一樣難以理解。
歡迎交流任何想法.
end…
如何讀懂複雜的C宣告
如何讀懂複雜的c宣告 k r曾經承認 c語言宣告的語法有時會帶來嚴重的問題 的確,諸如 char const next char c 10 int p 之類的宣告晦澀難懂,讓人迷茫。還好,peter van der linden在它的經典著作 expert c programming 中介紹了兩種解...
如何分析複雜的C語言宣告
宣告從它的名字開始讀取,然後按照優先順序順序以此讀取 優先順序從高到低依次是 宣告中被括號擴起來的那部分 字尾操作符 字首引數操作符 如果const和volatile關鍵字的後面緊跟著型別說明符 如int,long 那麼 它作用於型別說明符.其他情況下,從const和volatile關鍵字作用於它左...
C語言複雜指標宣告應如何閱讀
參考 http www.diybl.com course 3 program c cppsl 2008217 100104.html the right left rule start reading the declaration from the innermost parentheses,go...