



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言中申明解析方法的總結(jié)2011-11-04 00:00比特網(wǎng)悠虎關(guān)鍵字:C語言C語言中的聲明是一個比較令人頭痛的問題,尤其一些簡單的聲明看起來甚至?xí)钊烁械娇植溃绻且晃怀鯇W(xué)者,您肯定會對下面這幾個式子感到畏懼。由于對于剛接觸這種形式的人來說,這簡直太簡單了,當然前提是假定您未掌握分析這方面的專業(yè)知識。第一個聲明: void(*signal(int sig, void (*func)(int)(int);其次個聲明:const char *const(*sinc(char *sincg(),int (*p)(int a,int *b)(int *sing);其中第一個聲明是某系統(tǒng)函數(shù)的
2、聲明,而其次個聲明是我自己即興創(chuàng)作的,但我敢保證它除了簡單一點之外沒任何缺點。如果你對這兩個聲明感到異常頭痛,并且急迫的想知道如何分析這樣的聲明來提高自己的c水平和嫻熟度。那么就請閱讀下面的內(nèi)容,讓我將自己所學(xué)到的知識與您一起共享吧!首先我們來看一個很簡潔的例子簡單的東西都是由簡潔的構(gòu)成,一旦將全部簡潔的都搞明白了,你才能,并且也可以輕易的弄懂簡單的問題,而那時候便只需要某一個轉(zhuǎn)機就行了,那轉(zhuǎn)機往往就是總結(jié)。char next ;大家都很容易知道,這里聲明白一個char 類型的變量next.這里的next是一個標識符,表明它的變量身份,所以我們可以這樣想,一旦遇到標識符,猶如next,就用這樣
3、一句話替代,(標識符)是,比如前面的next,可以用next是來替代,猶如c語言中的宏定義一樣,如果這樣的說法讓你感到有點暈,我們換一種方式,干脆這樣定義一下,#define 標識符標識符是也就是說,一旦遇到標識符,你腦海中就立刻用(標識符)是這樣一句話來完全替代那個標識符。于是,剛才的那個聲明,char next;我們用更規(guī)范的類似數(shù)學(xué)上的形式思維來考慮一下,首先我們分析標識符next,依據(jù)前面的說法,我們看到next之后,立刻用next是。來替代,這樣,我們就得到了整個聲明的前一部分:“next是。”這樣一個句子,但是next究竟是什么呢,這時候我們需要看聲明中的其他內(nèi)容,比如上例中的ch
4、ar,這時候我們很自然的就弄清晰了next是(一個char類型的變量)。所以char表明的是一個類型變量。于是,經(jīng)過這樣一個思維過程,上面的聲明就分析完成了。大家先不要失去急躁,我用這么長的篇幅來敘述這樣一個簡潔的例子并不是掉你胃口,相反,是為了讓你更加容易理解下面的內(nèi)容。使我的文字跳動度不至于讓你的思維感到突兀甚至短路這不是我寫這篇總結(jié)的目的。接下來我們把這個聲明略微加長一點,使它變成char next();或者是char next;這時候,依據(jù)我們所學(xué)的知識,依然能夠很輕易的看出,前面一個是聲明的返回char類型變量的函數(shù),而后一個是聲明一個char類 型變量的數(shù)組,正是這個時候,有一個問
5、題請你注意,我們添加這個括號之后究竟使我們的思維轉(zhuǎn)變了什么,為什么當這兩個符號消失之后我們里就就明白了這是一 個函數(shù)或是一個數(shù)組,所以,在這里我想告知你也許你從未意識到過的一個新知識點就是,圓括號和方括號是聲明中的最高優(yōu)先級/B.這是一個特別重要的知 識點,當你發(fā)現(xiàn)標識符的右邊緊挨著一個左圓括號(請肯定注意到我這里寫的是左圓括號/B)或者是方括號的時候,你就不要有任何懷疑的告知自己,標識符 是一個(返回的函數(shù))或者數(shù)組。讓我們用這樣的思維再來分析一下char next();這個聲明,首先分析標識符next,得出next是。,然后向右看它右邊緊靠它的是不是圓括號或者方括號,這個例子中是一個圓括號
6、,所以我們得出next是一個返回。的函數(shù),最后通過char類型符得出,next是一個返回char型變量的函數(shù),至此,整個聲明分析完成。好了,現(xiàn)在讓我們來總結(jié)聲明分析中的前兩個基本步驟,也是關(guān)鍵步驟。首先,分析聲明中的標識符,這里有一個問題,不知道大家發(fā)現(xiàn)沒,我上面舉的例子中都是只有一個標識符,如果聲明中消失多個標識符怎么處理,比如說在next函數(shù)中增加幾個參數(shù),如char next(int a,int b);這 樣的話,整個聲明中有三個標識符,我們究竟首先選取分析哪個標識符呢。通過這個簡潔的例子,我們很容易觀察出,首先選擇的是最左邊的標識符,當然,我們決 不能依據(jù)一個特例就得出普遍結(jié)論,在這里
7、,我以一個已經(jīng)掌握了這個知識點的人的身份告知你,你的猜想是正確的,標識符從最左邊的開頭處理,c中確實是這樣做的。那么現(xiàn)在,你也掌握了這個知識點,讓我們連續(xù)向下商量。當我們選定標識符后,就要觀察緊靠它右邊的聲明器(也就是在聲明中消失的各種各樣的符號和變量,如(),*,const,等的官方說法),這里分兩種情況:如果消失的是一個左圓括號,那么標識符就是一個返回。的函數(shù),如果消失的是一個方括號,則毫無疑問的說明,標識符是一個數(shù)組,至于是一個什么樣的數(shù)組,則必須通過之后的分析才能夠知道。好了,現(xiàn)在又消失了一個新的問題,那就是如果標識符的緊鄰的右邊既不是左圓括號,也不是方括號怎么辦?比如是一個右圓括號呢
8、。這就需要我們的第三個比較重要的分析聲明的步驟。那就是:看標識符左邊的符號情況,分以下兩種:A, 如果緊鄰標識符左邊的是一個左圓括號,則找尋到和它匹配的右圓括號,將整個括號內(nèi)的聲明當成一個整體分析。B, 如果緊鄰標識符左邊的是*,或者const,或者volatile三者之一,則連續(xù)向左查找,直到聲明器超出三者之外為止。也就是說要始終找到某個符號既不是*,const,也不是volatile為止。C, 繼B之后,如果符號是左圓括號,則回到A進行處理。最后,剩下的符號可以一并閱讀,由于那肯定已經(jīng)是特別容易理解的了。在這里,我想為初學(xué)伴侶解釋一下const和volatile兩個修飾符,const表示所
9、修飾的變量是只讀的,也就是一經(jīng)賦值就不能再被修改。例如const char p; const char *p;此處需要大家注意的就是,const char *p;和char * const p;是不同的聲明,前一個表明指針p所指向的內(nèi)容是只讀的,而后一個則表示指針本身是只讀的,而它指向的內(nèi)容則是可以轉(zhuǎn)變的。我總結(jié)了一個規(guī)律供大家記憶便利,那就是如果 *和標識符是一個整體,沒有被任何東西分開,則說明const修飾的是指針指向的內(nèi)容,如上例中的const char *p;或者是char const *p;*和標識符(p)沒有被const這個修飾符分開,則說明const修飾的是指針指向的內(nèi)容,而一旦
10、*和標識符被分開了,則說明const修飾的是指針本身,而指針指向的變量則是可變的。除非指向的變量本身也被const修飾了,如const char * const p;其次個修飾符volatile表明修飾的變量是他是可以被本程序和別的程序轉(zhuǎn)變數(shù)據(jù),象系統(tǒng)時間,不管這個程序是不是斷點,sleep,別的程序都轉(zhuǎn)變他的值。好了,如果大家仔細閱讀了上面的部分,肯定會發(fā)現(xiàn)其實細心去分析之后,聲明的理解也并不如何困難,現(xiàn)在我們先來用一個比較常規(guī)的聲明來嫻熟一下上面的思維方式,最后我們以解決本文開頭提到的兩個聲明作為結(jié)尾。char (*p)(); /首先看最左邊的標識符p,(表明p是)他的右邊既不是左圓括號也
11、不是方括號,于是看左邊,發(fā)現(xiàn)是*,依據(jù)上面的原則(如果緊鄰標識符左邊的是*,或者const,或者volatile三者之一,則連續(xù)向左查找,直到聲明器超出三者之外為止。也就是說要始終找到某個符號既不是*,const,也不是volatile為止。)我們連續(xù)向左查找,發(fā)現(xiàn)下一個符號是(, 于是依據(jù)原則(繼B之后,如果符號是左圓括號,則回到A進行處理。)我們找尋匹配這個左圓括號的右圓括號,那么,我們就可以把這個括號里的東西作為一個整體來處理,該例子中括號內(nèi)的內(nèi)容為*p,所以我們得出p是 一個指針,既然是一個指針,就肯定指向某一樣?xùn)|西,而這個東西,我們必須連續(xù)探究才能把它給挖出來,現(xiàn)在我們已經(jīng)把括號內(nèi)的
12、東西當成一個整理處理了,就相 當它是一個變量(我們通過分析這個括號內(nèi)的東西確實得出了一個指針類型的變量,)于是我們可以把它當成最初的標識符,回到第一步分析,看這個變量(實際上 是把整個括號看成一個標識符,分析這個括號最靠近右邊的符號)左邊接近的是否是左圓括號或者是方括號,很幸運的,我們發(fā)現(xiàn)了左圓括號,就說明這個變量(也 就是整個括號)是一個返回的函數(shù),而原來那個等價于變量的括號內(nèi)部事實上是一個指針變量,再結(jié)合我們剛才分析出的,就可以知道,這個指針變量指向一個返回。的函數(shù),最后我們分析這個函數(shù)究竟返回什么,這時候只剩下一個char類型符了,所以整個聲明的內(nèi)容是,一個指向函數(shù)的指針,該函數(shù)返回一個
13、char型的變量分析出這樣一個聲明并不困難,難就難在用上面的思維進行分析,上面的分析步驟事實上是編譯器進行聲明分析的步驟,但其實就上面總結(jié)的還并不完全。那么下面我就將完整的聲明的分析步驟排列出來:分析的步驟匹配的符號閱讀方式1 取最左邊的標識符標識符表示標識符是2查看標識符右邊下一個 可能的大小對于每一對,表示符號,如果是方括號 的數(shù)組3 如果是一個左圓括號 ( 可能的參數(shù)) 到右括號為止的內(nèi)容表示返回的函數(shù)4 如果左邊的符號是一個 ( 這個左括號把已經(jīng)處理的左圓括號部分聲明組合在一起,直到遇見對應(yīng)的右括號,然后從其次步 重新開頭5 如果左邊的符號是下述符號之一*,const,volatile
14、 *,const,volatile 連續(xù)向左讀符號,知道聲明器 超出 三者之外,然后重復(fù)第4步6 剩下的符號形成基本類型基本類型如char,int 剩余的符號可一并閱讀以上就是聲明分析的完整總結(jié)版,也是c專家編程書中排列出來的,我這里只是借鑒一下,供大家學(xué)習(xí)參考。好了,有了以上的基礎(chǔ),我們就好分析第一個恐怖型的聲明,從這樣的聲明中,我們上面的分析步驟的優(yōu)勢就體現(xiàn)出來了void(*signal(int sig, void (*func)(int)(int);首先,最左邊的標識符是signal,表明signal是。,緊靠它右邊的是一個左圓括號,說明signal是一個返回的函數(shù),而int sig,
15、void (*func)(int)是這個函數(shù)的參數(shù),里面的每一個部分都可以重新用我們的方法進行分析,這里就不敘述了。然后我們依據(jù)上面的分析步驟,再看左邊的符號是什么,是一個指針符*,表明該函數(shù)是一個返回一個指針的函數(shù),此時,函數(shù)已經(jīng)被我們簡化成void p(int);j其中p是一個返回指針的函數(shù),是我們上面分析所得出的結(jié)果。那么該指針指向的是什么呢,這里再依據(jù)前面的步驟,分析整個括號的接近右邊的符號,也就是p(我們已經(jīng)將整個括號中的內(nèi)容等價為p這個假想中的標識符)右邊的符號,發(fā)現(xiàn)是一個左圓括號,所以p是一個返回的函數(shù),而p是一個指針(實際上是某一個函數(shù)所返回的指針),所以p是一個指向函數(shù)的指針,最后依據(jù)void推斷出,該函數(shù)的返回值為空
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備電流報警管理制度
- 設(shè)備計劃檢修管理制度
- 設(shè)計主管組員管理制度
- 設(shè)計投標規(guī)章管理制度
- 設(shè)計項目制度管理制度
- 診所醫(yī)保財務(wù)管理制度
- 診所藥房安全管理制度
- 試驗檢測安全管理制度
- 財務(wù)資金借支管理制度
- 財政完善權(quán)責管理制度
- 語文課堂精彩兩分鐘PPT課件
- 三生事業(yè)六大價值
- 鋯石基本特征及地質(zhì)應(yīng)用
- 絲網(wǎng)除沫器小計算
- 制缽機的設(shè)計(機械CAD圖紙)
- 學(xué)校財務(wù)管理制度
- 三年級下冊美術(shù)課件-第15課色彩拼貼畫|湘美版(共11張PPT)
- 水稻病蟲統(tǒng)防統(tǒng)治工作總結(jié)
- 水在不同溫度下的折射率、粘度和介電常數(shù)
- howdoyoucometoschoolPPT課件
- 四柱特高弟子班絕密資料——席學(xué)易
評論
0/150
提交評論