解釋宣告
C 的獨特語法特性是宣告映象使用宣告的物件,就像它在普通表示式中一樣。
具有相同優先順序和關聯性的以下運算子集在宣告符中重用,即:
- 一元
* dereference
運算子,表示指標; - 二進位制
[]
陣列索引運算子,表示一個陣列; - (1 + n)-ary
()
函式呼叫運算子表示函式; ()
分組括號,它覆蓋其餘列出的運算子的優先順序和相關性。
以上三個運算子具有以下優先順序和關聯性:
操作者 | 相對偏好 | 關聯性 |
---|---|---|
[] (陣列順序) |
1 | 左到右 |
() (函式呼叫) |
1 | 左到右 |
* (取消引用) |
2 | 右到左 |
在解釋宣告時,必須從識別符號向外開始,並按照上表以正確的順序應用相鄰的運算子。運算子的每個應用程式都可以用以下英文單詞代替:
表達 | 解釋 |
---|---|
thing[X] |
一系列大小的 X of … |
thing(t1, t2, t3) |
一個功能採取 t1 ,t2 ,t3 並返回… |
*thing |
一個指向…的指標 |
因此,英語解釋的開頭將始終以識別符號開頭,並以宣告左側的型別結束。
例子
char *names[20];
[]
優先於*
,所以解釋是:names
是一個指向 char
的指標大小為 20 的指標陣列。
char (*place)[10];
如果使用括號覆蓋優先順序,則首先應用*
:place
是指向 char
的 10 號資料的指標。
int fn(long, short);
這裡沒有優先擔心:fn
是一個採用 long
,short
引數和返回 int
的函式。
int *fn(void);
首先應用 ()
:fn
是一個採用 void
並返回指向 int
的函式。
int (*fp)(void);
覆蓋 ()
的優先順序:fp
是指向 void
並返回 int
的函式的指標。
int arr[5][8];
多維陣列不是規則的例外; []
運算子根據表中的關聯性以從左到右的順序應用:arr
是一個大小為 5 的陣列,大小為 8 的 int
。
int **ptr;
兩個解除引用運算子具有相同的優先順序,因此關聯性生效。運算子按從右到左的順序應用:ptr
是指向 int
的指標。
多個宣告
逗號可以用作分隔符 ,
,以便在單個語句中分隔多個宣告。以下語句包含五個宣告:
int fn(void), *ptr, (*fp)(int), arr[10][20], num;
上例中宣告的物件是:
fn
:採取void
並返回int
的功能;ptr
:指向int
的指標;fp
:指向int
並返回int
的函式的指標;arr
:一個大小為 10 的陣列,大小為 20;num
:int
。
替代解釋
因為宣告映象使用,所以宣告也可以根據可以應用於物件的運算子和該表示式的最終結果型別來解釋。位於左側的型別是應用所有運算子後產生的最終結果。
/*
* Subscripting "arr" and dereferencing it yields a "char" result.
* Particularly: *arr[5] is of type "char".
*/
char *arr[20];
/*
* Calling "fn" yields an "int" result.
* Particularly: fn('b') is of type "int".
*/
int fn(char);
/*
* Dereferencing "fp" and then calling it yields an "int" result.
* Particularly: (*fp)() is of type "int".
*/
int (*fp)(void);
/*
* Subscripting "strings" twice and dereferencing it yields a "char" result.
* Particularly: *strings[5][15] is of type "char"
*/
char *strings[10][20];