複雜的 c/c++ 宣告, 你只需要使用一條規則:
理解 c 語言宣告的優先順序:
a 宣告從它的名字開始讀取, 然後按照優先順序順序依次讀取.b 優先順序從高到低依次是:
b. 1 宣告中被括號括起來的那部分
b. 2 字尾操作符:
括號 () 表示這是乙個函式, 而
方括號表示這是乙個陣列
b. 3 字首操作符: 星號 * 表示 "指向 ... 的指標".
c 如果 const 和 (或) volatile 關鍵字的後面緊跟型別說明符 (如 int, long 等), 那麼它作用 於型別說明符. 在其他情況下, const 和 (或) volatile 關鍵字作用於它左邊緊鄰的指標星號.
char*const*(
*next)() ;
//next 是乙個指標, 這個指標指向乙個無參的函式, 這個函式返回乙個常指標, 這個常指標指向另乙個 char *.
b. 2 和 b. 3 必會交替執行, 因為 c/c++ 中不能出現 var() 或 var() 或 var()(), 因此分析完乙個識別符號後的 ( 或 [ 時, 都會轉向左邊去尋找星號 *, 只有一種情況特例, 就是多維陣列, 如: int *arr[10][10] ; 這種情況需要在識別符號後面一直尋找中括號, 直到找完為止. 詳情參見 c 語言語法所不能
對於上述 c 條件, 我個人有些補充:
如果 const 或 volatile 緊鄰型別說明符, 則其修飾的就是型別說明符. 否則, const 緊鄰星號 *, 則其修飾的是指標本身.
總結來說, 就是const 是左結合的, 僅當 const 左邊沒有可修飾的符號時才進行右結合. 因為要考慮到如下情況:
intconst
*p ;
//此時在型別說明符 (int) 在 const 的前面, 所以是 (int const) *p, 即常指標. 等同於 int const *p ;
說的直白一些就是先找到識別符號, 然後往右看, 直到看到 ')' 為止, 然後向左走, 跳過已讀過的符號, 直到看到前面開括號對應的 '(' 為止. 我一直是這麼做的. 例如:
10 9 8 7 3 1 2 6 5 4char
*const*(
*next[10])(int const x) ;
next 是乙個識別符號
這個識別符號是乙個是個元素的陣列
這個陣列存放的是指標, 這些指標指向函式
所指向的函式含有乙個引數 x
這個引數是常量變數
這個引數型別是 int 型
這個函式返回乙個指標
這個指標指向另乙個指標
被指向的指標是指標常量
這個指標常量指向乙個 char 型變數
c c 中變數的宣告和定義
不管是函式還是變數的宣告,都是為了告訴編譯器我要使用這個變數或者函式了,用於型別檢查。在定義的時候編譯器是不會分配任何記憶體的,比如下面的函式 void func 當函式執行到int a 的時候,這是乙個宣告,編譯器不會為其分配記憶體空間。當執行到a 0 這是乙個定義,編譯器才會為其分配記憶體空間。...
C C 中變數(區域性變數)的宣告和範圍
全域性變數往往在main函式中宣告,其作用範圍為整個 區域性變數存在於宣告該變數的塊語句或方法結束的右花括號 之前的作用域內。本文對c 中的一些變數宣告和範圍關係借幾個demo展示出來。情況一 變數包含產生歧義 根據變數的作用域遵循的原則 區域性變數存在於宣告該變數的塊語句或方法結束的右花括號 之前...
c c 變數定義與宣告
我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 望我的指點對你受益 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種...