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

2021-09-27 08:24:38 字數 1888 閱讀 1291

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

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

先自己測試一下, 如下的宣告你能讀懂嗎?

void (*signal(int sig, void(*func)(int))) (int); // 當然,比這個複雜的宣告還有很多...
要讀懂乙個宣告,必須要懂得其中的優先順序規則

優先順序規則如下:

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

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

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

b.2: 字尾操作符:

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

方括號 表示這是乙個陣列

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

c: 如果 const 和 ( 或 ) volatile 關鍵字的後邊緊跟型別說明符(如 long 等), 那麼它作用於型別說明符。

在其他情況下,const 和 ( 或 ) volatile 關鍵字作用於它左邊緊鄰的指標星號

例1:

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...