|   C語言聲明學習之中級篇  時間:2016-12-29作者:華清遠見(jian) C語言(yan)的(de)聲明存(cun)在的(de)大(da)的(de)問題(ti)就是(shi)你(ni)無法以一(yi)種人們所習慣(guan)的(de)自然方式從(cong)左到右閱讀一(yi)個聲明,程序(xu)員(yuan)必須記住特殊的(de)規(gui)則才能推斷出(chu)int *p[3]到底(di)是(shi)一(yi)個int類型的(de)指針(zhen)數組(zu)(zu)還是(shi)一(yi)個指向int數組(zu)(zu)的(de)指針(zhen)。(如(ru)果(guo)你(ni)對此(ci)還有疑惑的(de)話,建議你(ni)去讀一(yi)讀《C專(zhuan)家編程》的(de)第三章:“分析C語言(yan)的(de)聲明”) 對于這樣(yang)一個(ge)聲明(ming),我(wo)們應該如何分析? ——————int f()[]; 首先(xian),f是(shi)一(yi)個函(han)數,其次,它的(de)返(fan)回(hui)值(zhi)是(shi)一(yi)個整型數組。貌似就是(shi)這(zhe)樣啊,但實際上,這(zhe)個例(li)子隱藏著一(yi)個陷阱(jing),因為這(zhe)個聲明是(shi)非(fei)法的(de),呵(he)呵(he),在我們(men)的(de)C語言(yan)里,函(han)數只能返(fan)回(hui)變(bian)量值(zhi),不能返(fan)回(hui)數組。 還有一(yi)個讓人頗費腦(nao)筋(jin)的聲明: ——————int f[] (); 
	這里,f應該是一個數組,數組的元素類型是返回值為整型的函數。請不要對它看似正確的表面所迷惑,其實這個聲明也是非法的!因為數組元素必須具有相同的長度,但是不同的函數顯然可能具有不同的長度吧,呵呵。 ——————int (*f[]) (); 請你分(fen)析一(yi)下(xia)它的(de)含(han)義?首先,你能否確(que)定它是(shi)對的(de)還是(shi)錯的(de)? 首(shou)先,我們(men)(men)(men)必須找到所(suo)有(you)的操(cao)作符,然后按照正確的次序執行(xing)它們(men)(men)(men)。這里有(you)兩對(dui)括號(hao),它們(men)(men)(men)分別具(ju)有(you)不同的含義。第一個(ge)(ge)括號(hao)內的表達式*f[]首(shou)先進行(xing)求值(zhi),所(suo)以f是(shi)一個(ge)(ge)元(yuan)(yuan)素為某種類型的指(zhi)針(zhen)的數(shu)組;末(mo)尾的括號(hao)是(shi)函數(shu)調(diao)用操(cao)作符,所(suo)以我們(men)(men)(men)可以肯定f是(shi)一個(ge)(ge)數(shu)組,數(shu)組元(yuan)(yuan)素的類型是(shi)函數(shu)指(zhi)針(zhen),它所(suo)指(zhi)向的函數(shu)的返(fan)回值(zhi)是(shi)一個(ge)(ge)整型值(zhi)。 清楚了上面這個聲(sheng)明,下(xia)面這個聲(sheng)明應該就(jiu)比(bi)較容易分析(xi)了: ——————int *(*f[ ]) ( ); 這(zhe)個(ge)聲(sheng)明(ming)創建了一個(ge)指針(zhen)數(shu)組(zu),指針(zhen)所(suo)指向的類型(xing)是(shi)返回(hui)值為整型(xing)指針(zhen)的函數(shu)。 ANSI C推薦我們(men)使(shi)用完整的函(han)數原(yuan)型,使(shi)聲明更為明確,例如: 
	int (*f) ( int, float ); 前者把(ba)f聲明(ming)為一個(ge)(ge)函數(shu)指針,它所指向的函數(shu)接受兩個(ge)(ge)參(can)數(shu),分別是一個(ge)(ge)整(zheng)(zheng)型(xing)數(shu)和浮點型(xing)值,并返回一個(ge)(ge)整(zheng)(zheng)數(shu)。 后(hou)者把g聲明為一(yi)(yi)個數(shu)(shu)(shu)組,數(shu)(shu)(shu)組的(de)元素類(lei)型(xing)是(shi)(shi)(shi)一(yi)(yi)個函(han)(han)數(shu)(shu)(shu)指針,它所(suo)指向的(de)函(han)(han)數(shu)(shu)(shu)接(jie)受(shou)兩個參數(shu)(shu)(shu),分別是(shi)(shi)(shi)一(yi)(yi)個整型(xing)數(shu)(shu)(shu)和(he)浮點型(xing)值,并返回一(yi)(yi)個整型(xing)指針。盡管(guan)原型(xing)增加了聲明的(de)復雜度,但(dan)是(shi)(shi)(shi)ANSI C還是(shi)(shi)(shi)大力提(ti)倡這個風格(ge),因為這樣可(ke)以向編譯器(qi)提(ti)供一(yi)(yi)些額外(wai)的(de)信(xin)息。 在中級篇的后,給大家推薦一(yi)個(ge)實(shi)用的C語言(yan)工具(ju)(ju):cdecl,這(zhe)個(ge)程(cheng)序可(ke)用于所有UNIX操作(zuo)系統(tong),它可(ke)以(yi)將(jiang)C語言(yan)的聲明翻(fan)譯成通俗易(yi)懂的語言(yan),并可(ke)以(yi)將(jiang)C語言(yan)聲明的語法轉換(huan)成為(wei)具(ju)(ju)體的C語言(yan)聲明。 如果你是用(yong)的是ubuntu操(cao)作(zuo)系統,那么你只需要執行sudo apt-get install cdecl就可(ke)以(yi)把cdecl工具安裝(zhuang)到你的計算機上,對于(yu)別的unix操(cao)作(zuo)系統,你同樣(yang)可(ke)以(yi)下載源(yuan)碼包安裝(zhuang)(comp.sources.unix.newsgroup)。 在shell終端,我們執行cdecl就可(ke)以進入cdecl>提示符,然后(hou)輸(shu)入:explain int (*(*f)())[10]; 可(ke)以得到: 
	 可(ke)以看到,cdecl為我們解釋(shi)了int (*(*f)()) [10]這個(ge)聲明的(de)含義,有了這個(ge)工具,不管我們遇到怎樣(yang)詭(gui)異的(de)C語言(yan)聲明,都可(ke)以從容應對了吧,呵(he)呵(he)! 當(dang)然,我們可(ke)以(yi)給cdecl一個聲明的(de)語(yu)法(fa),把上面一段解釋輸入(ru)進去(qu),就可(ke)以(yi)看(kan)到: 
	 可見,cdecl又幫我們把這段通俗(su)的(de)解釋轉換成為專業(ye)的(de)C語言的(de)聲明。 怎(zen)么樣,這個工(gong)具是不是很好(hao)用(yong),如(ru)果(guo)你的(de)(de)系統里(li)面還沒有(you)這個工(gong)具的(de)(de)話,你是不是應該(gai)趕快安裝一個呢(ni)?讓它成為你學習C語(yu)言(yan)的(de)(de)好(hao)幫手吧。好(hao)了,今天關于C語(yu)言(yan)聲明(ming)的(de)(de)中級篇就到此(ci)為止(zhi),讓我們高級篇見! 發表評論 
 |