從兩個例子分析C語言的宣告

2022-02-13 15:24:12 字數 1175 閱讀 9575

從兩個例子分析c語言的宣告

在讀《c專家程式設計》一書的第三章時,書中談到c語言的宣告問題,《c專家程式設計》這本書只有兩百多頁,卻花了一章的內容去闡述這個問題,足以看出這個問題的重要性,要想透徹理解c語言的宣告問題僅僅看書是遠遠不夠的,需要平時多實踐並大量閱讀別人寫的**。下面借鑑《c專家程式設計》書中的兩個例子來說說這個問題,以下很多內容是摘自《c專家程式設計》的第55頁-79頁。

在c語言中,宣告的形式和使用的形式相似,這種用法可能是c語言的獨創,k & r也承認"c語言宣告的語法有時候會帶來嚴重的問題"。c語言的宣告存在的最大問題是你無法以一種人們所習慣的自然方式從左到右閱讀乙個宣告。下面看乙個例子:

char * const *(*next)();
如果在第一眼就能看出這個宣告要表達的意思,那麼證明你的c語言功底已經到了一定的程度。《c專家程式設計》一書中給出的識別步驟為:

1)從變數名next開始,並注意到它直接被括號括住;

2)所以先把括號裡的東西作為乙個整體,得出"next」是乙個指向....的指標;

3)然後考慮括號外面的東西,在星號字首和括號字尾之間做乙個選擇;

4)根據c語言宣告的優先順序規則(後面會給出),優先順序較高的是右邊的函式括號,所以得出"next"是乙個函式指標,指向乙個返回...的函式;

5)然後,,處理字首"*",得出指標所指的內容;

6)最後,把"char * const *"解釋為指向字串的常量指標。

把上述結果加以概括,這個宣告表示"next是乙個指標,它指向乙個函式,這個函式返回另乙個指標,該指標指向乙個型別為char的常量指標"。這個問題便迎刃而解了.

下面再看乙個例子:

char *(* c[10])(int **p);
首先,從變數名c開始,然後處理字尾"",表明c是乙個陣列,接著處理字首"*",表示c是乙個指標陣列。然後處理後面的括號,表明陣列c中的指標型別是指向乙個函式的指標,並且這個函式的引數有且僅有乙個:為指向指標的指標,該函式的返回值為乙個指向字串的指標。歸納在一起,為:

"c是乙個陣列[0...9],它的元素型別是函式指標,其所指向的函式返回值是乙個指向字串的指標,並且把乙個指向指標的指標作為唯一的引數"。

以下是《c專家程式設計》一書中提到的c語言宣告的優先順序規則,摘自第64頁。

C 從兩個例子理解async await

輸出的結果為 可以看出執行的結果為 a d b c e.我們再看下乙個例子 注意,我們把 中d和e的位置交換 結果 結果為 a b c e d async方式,使用async標記test為非同步方法,用await標記task表示方法內需要耗時的操作。主線程碰到await時會立即返回,繼續以非阻塞形式...

C 從兩個例子理解async await

輸出的結果為 可以看出執行的結果為 a d b c e.我們再看下乙個例子 注意,我們把 中d和e的位置交換 結果 結果為 a b c e d async方式,使用async標記test為非同步方法,用await標記task表示方法內需要耗時的操作。主線程碰到await時會立即返回,繼續以非阻塞形式...

C 中Override的兩個例子

main.cc created on 2008 8 5 author administrator includeclass base class derived public base int main int arg,char args 結果 derived clone derived clone...