c語言聲明的分析方法

  最近幾天在看K&R的《c程序設計語言》,看似薄薄的一本書,感覺要完全讀下來(包括習題)還要下很大的功夫啊,今天看到第5章指針與數組中5.12節的複雜聲明,文中給了一個示例程序來說明如何正確分析c語言的聲明,比如說:

 

    char (*(*x[3])())[5];

          x: array[3] of pointer to function returning

            pointer to array[5] of char.

 

第一行是一個聲明,下面兩行是對這個聲明進行分析之後的解釋,在給出整個示例程序之前,書中給出了一個簡單的分析聲明的語法形式並引用了附錄作爲參考。我翻來覆去看了幾遍這個語法形式,還是沒有搞懂怎麼回事,但是我想起另一本c的經典書《c專家編程》有一章是專門講如何分析c聲明的語法的,於是我找來那本書看了一下,發現還是《c專家編程》講的娓娓道來,通俗易懂啊。

 

 

  下面我就結合自己的經驗說明一下如何簡單的分析c語言的聲明:

   第0步:沉着冷靜,不要被多重嵌套的括號嚇到(這個步驟熟練後可以省略:))

   第1步:從左至右,找到第一個標識符。

   第2步:查看標識符右邊的符號,並確定是一個數組還是函數。

   第3步:查看左邊的符號。

   第3步a:如果是左括號則將處理過的部分結合到一起直到遇到右括號作爲標識符返回第2步。

   第3步b:如果是const,volatile,*其中之一則繼續向左直到不是這三個符號之一。

   第4步:剩下的符號構成聲明的基本類型。

 

 

   我估計很多人已經頭暈了,不知道上面什麼意思,下面我結合上面的那個例子說明一下:

   第1步:從左至右找到第一個標識符,那就是x。

   第2步:查看標識符右邊的符號是'[',所以x是一個具有3個元素的數組。

   第3步:查看左邊的符號,是'*',轉至第3步b。

   第3步b:說明數組中的元素都是指針,向左是左括號了,將這個左括號結合到對應的右括號(也就是(*x[3]))作爲新的標識符返回第2步。

   第2步:查看右邊的符號是'(',說明指針是指向參數列表爲空的函數的指針。

   第3步:查看左邊的符號,是'*', 轉至第3步b。

   第3步b:說明函數的返回值是指針,向左是左括號,將這個左括號結合到對應的右括號(也就是(*(*x[3])()))作爲新的標識符返回第2步。

   第2步:查看右邊的符號是'[',所以是指向具有五個元素的數組的指針。

   第3步:查看左邊的括號,既不是a情況,也不是b情況,跳至第4步。

   第4步:數組的類型爲char。

 

   所以以上的聲明表示的是x是一個具有3個元素的數組,數組的每個元素都是一個指向函數的指針,函數的參數列表爲空,返回值是指向一個具有5個元素的指針,元素的類型爲char。

 

  下面有兩道習題,都是來自《c專家編程》的例子,答案在書中有,這裏就不給出了:

    

    char* const *(*next)();

    char *(* c[10])(int **p);

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章