理解C C 語言的宣告語法 宣告子

2022-08-24 16:06:13 字數 2762 閱讀 6842

理解c/c++語言的宣告語法-宣告

。 乙個宣告為每個宣告子都宣告乙個實體(entity),同時為那個實體給出乙個名字,並且隱含的給出儲存類,型別,和由說明符給出的其它特性。說明符和宣告子一起決定了名字是否是乙個物件,陣列,指標,引用或函式。例如,

宣告x為乙個整型指標,f為乙個函式返回乙個整型。正是宣告子*x和f()使型別x和f產生區別。

int *x, f();

declarator: [ * [ const] | & ]... direct-declarator

direct-declarator: declarator-id | ( declarator ) |

direct-declarator ( parameter-declaration-list ) |

direct-declarator [ constant-expression ]

a declarator-id is an identifier, possibly qualified:

declarator-id: [ nested-name-specifier ] identifier

nested-name-specifier: ...

如果宣告子是乙個僅包含乙個declarator-id的直接-宣告子,那麼這說明這個識別符號具有decl-specifiers隱含的屬性,而沒有進一步的修飾。例如,在下面的宣告中

int n;

宣告子是n,這是乙個只包含direct-declarator的declarator-id,因此根據含義,n的型別為整型。

如果宣告子為其它形式,那麼你可以按照下面的方法確定識別符號的型別:首先,假設t為decl-specifiers隱含的型別,忽略friend或static等非型別屬性,同時假設d為宣告子。然後重複下面的步驟直到推導出d為乙個declarator-id,此時t正是你所尋找的型別:

1. 如果d形如(d1),那麼用d1替換d。

2. 如果d形如* d1 或 * const d1,那麼根據是否有const,用「指標,它指向t」或者「常量指標,它指向t」替換t,然後用d1替換d。

3. 如果d形如d1(引數-宣告-列表),那麼用引數由引數-宣告-列表定義的、「返回t的函式」替換t,然後用d1替換d。

4. 如果d形如d1[常量-表示式],那麼用元素個數由常量-表示式給出的「t陣列」替換t,然後然後用d1替換d。

5. 最後,如果宣告子形如&d,那麼用「t引用」替換t,然後用d1替換d。

作為乙個示例,考慮下面的宣告

int *f();

首先,t和d分別為int和*f(),因此d形如*d1,其中d1為f()。

你可能認為d可以形如d1() 或者 *d1。然而,如果d形如d1(),那麼d1將不得不為*f,d1將是乙個direct-declarator(因為本節開始處的語法注1規定只有direct-declarator前面是())。但是如果我們看看direct-declarator的定義注2,很明顯它不能包含*。因此,d只能是*f(),它形如*d1,其中d為f()。

既然我們已經確定d1為f(),那麼我們知道必須用「指標,它指向t」替換t,即「指標,指向整型」,同時用f()替換d。

至此我們還沒有解析d為declarator-id,因此我們必須重複該過程。此時,d1只能是f,因此我們用「返回t的函式」替換t,它是乙個「返回整型指標不帶引數的函式」,然後用f替換d。

此時,d為declarator-id,因此推導結束。我們已經確定宣告

int *f();

宣告f的型別為「不帶引數返回整型指標的函式」。另乙個例子,宣告

int* p, q;

具有兩個宣告子,*p和q。對於每個宣告子,t都是int。對於第乙個宣告子,d是*p,因此t變成「指標,它指向整型,」而d為p。宣告p型別為「指標,它指向整型」。

我們單獨分析第二個宣告子,t還是int,d是q。很明顯宣告q為整型。

最後,讓我們分析§10.1.2/173中那個奇怪的例子:

double (*get_analysis_ptr())(const vector&);

分析過程可以分為下面五個步驟

1. t: double    d: (*get_analysis_ptr())(const vector&)

2. t: 返回double帶有 const vector& 引數的函式    d: (*get_analysis_ptr())

3. t: function returning double... (如前所示)    d: *get_analysis_ptr()

4. t: 指標,它指向乙個返回double...的函式    d: get_analysis_ptr()

5. t: 乙個函式,返回乙個函式指標,它指向乙個返回double...的函式   d: get_analysis_ptr

get_analysis_ptr是乙個函式,它返回乙個函式指標,它指向乙個返回double,帶有const vector&引數的函式。我們將如何展開const vector&作為乙個練習。幸運的是,很少有函式宣告如此令人迷惑;它們中的大多數看起來

declarator: declarator-id ( parameter-declaration-list )

到目前為止,常見情況中最難的是返回函式指標的函式。

注1:這裡將allows翻譯為規定而不是允許。因為如果翻譯為允許,言外之意是()後面還可以是其它東西,但是在五條語法中找不到這種東西。語法指的是direct-declarator ( parameter-declaration-list )

注2:「declarator: [ * [ const] | & ]... direct-declarator」

理解C C 語言的宣告語法 宣告

c c a.1宣告 一些宣告可能難以理解,特別是如果宣告幾個不同型別的名字或者那些指向函式指標的函式。例如在 10.1.1 171中,我們看到 int p,q 定義p為乙個 整型指標 型別的物件,q為乙個整型物件。在 10.1.2 173中,我們看到 double get analysis ptr ...

C語言宣告語法

概述 在很多情況下,尤其是讀別人所寫 的時候,對c語言宣告的理解能力變得非常重要,而c語言本身的凝練簡約也使得c語言的宣告常常會令人感到非常困惑,因此,在這裡我用一篇的內容來集中闡述一下這個問題。問題 宣告與函式 有一段程式儲存在起始位址為0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做?...

關於C C 函式指標宣告的理解

前言 由於最近對函式指標的理解比較模糊,所有又重新學習了一把關於函式指標的知識,參考了很多書籍和網上的文章。現在本人進行一下分享和總結。本文的其實只是整理和總結別人現有的文章,作為備用參考文件。正文 要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表...