




免費(fèi)預(yù)覽已結(jié)束,剩余22頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
精選文庫C語言書寫規(guī)范指南第1章文件結(jié)構(gòu)每個C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。另一個文件用于保存程序的實(shí)現(xiàn)(implementation),稱為定義(definition)文件。C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴。1.1版權(quán)和版本的聲明版權(quán)和版本的聲明位于頭文件和定義文件的開頭(參見示例1-1),主要內(nèi)容有:(1)版權(quán)信息。(2)文件名稱,標(biāo)識符,摘要。(3)當(dāng)前版本號,作者/修改者,完成日期。(4)版本歷史信息。/*Copyright(c)2001,吉林大學(xué)物理學(xué)院無線電*Allrightsreserved.*文件名稱:filename.h*文件標(biāo)識: *摘要:簡要描述本文件的內(nèi)容*當(dāng)前版本:1.1*作者:輸入作者(或修改者)名字*完成日期:2007年7月20日*取代版本:1.0*原作者:輸入原作者(或修改者)名字*完成日期:2007年5月10日*/示例1-1版權(quán)和版本的聲明1.2頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成:(1)頭文件開頭處的版權(quán)和版本聲明(參見示例1-1)。(2)預(yù)處理塊。(3)函數(shù)和類結(jié)構(gòu)聲明等。假設(shè)頭文件名稱為 SCL_SPI.h,頭文件的結(jié)構(gòu)參見示例1-2?!疽?guī)則1-2-1】為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用 #ifndef/#define/#endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊?!疽?guī)則1-2-2】用 #include格式來引用標(biāo)準(zhǔn)庫的頭文件(編譯器將從標(biāo)準(zhǔn)庫目錄開始搜索)?!疽?guī)則1-2-3】用 #include“filename.h”格式來引用非標(biāo)準(zhǔn)庫的頭文件(編譯器將從用戶的工作目錄開始搜索)?!疽?guī)則1-2-4】 #include 后面使用TAB鍵控制排版 ?!疽?guī)則1-2-5】頭文件中只存放“聲明”而不存放“定義”【規(guī)則1-2-6】全局變量在頭文件中聲明,在.c文件中定義 .h extern in tvalue; 聲明。.c in tvalue=0x10; 定義?!疽?guī)則1-2-7】局部變量在.c中定義 (static) unsigned in tvalue; 定義。/版權(quán)和版本聲明見示例1-1,此處省略。 #ifndefSCL_SPI_H /防止SCL_SPI.h被重復(fù)引用#defineSCL_SPI_H#include /引用標(biāo)準(zhǔn)庫的頭文件#include“SCL_CAN.h”/引用非標(biāo)準(zhǔn)庫的頭文件void Function1();/全局函數(shù)聲明extern unsign int value;/全局變量聲明#endif示例1-2C頭文件的結(jié)構(gòu)1.3定義文件的結(jié)構(gòu)定義文件有三部分內(nèi)容:(1)定義文件開頭處的版權(quán)和版本聲明(參見示例1-1)。(2)對一些頭文件的引用。(3)程序的實(shí)現(xiàn)體(包括數(shù)據(jù)和代碼)。假設(shè)定義文件的名稱為SCL_SPI.c,定義文件的結(jié)構(gòu)參見示例1-3。/版權(quán)和版本聲明見示例1-1,此處省略。#include“SCL_SPI.h”/引用頭文件/全局變量定義unsign int value = 0x10;/全局函數(shù)的實(shí)現(xiàn)體void Function1() 示例1-3C定義文件的結(jié)構(gòu)1.4頭文件的作用早期的編程語言如Basic、Fortran沒有頭文件的概念,C語言的初學(xué)者雖然會用使用頭文件,但常常不明其理。這里對頭文件的作用略作解釋:(1)通過頭文件來調(diào)用庫功能。在很多場合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會從庫中提取相應(yīng)的代碼。(2)頭文件能加強(qiáng)類型安全檢查。如果某個接口被實(shí)現(xiàn)或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的負(fù)擔(dān)。 1.5目錄結(jié)構(gòu)如果一個軟件的頭文件數(shù)目比較多(如超過十個),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護(hù)。例如可將頭文件保存于 include 目錄,將定義文件保存于 source 目錄(可以是多級目錄)。如果某些頭文件是私有的,它不會被用戶的程序直接引用,則沒有必要公開其“聲明”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個目錄。 第2章程序的版式版式雖然不會影響程序的功能,但會影響可讀性。程序的版式追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。可以把程序的版式比喻為“書法”。好的“書法”可讓人對程序一目了然,看得興致勃勃。差的程序“書法”如螃蟹爬行,讓人看得索然無味,更令維護(hù)者煩惱有加。請程序員們學(xué)習(xí)程序的“書法”,彌補(bǔ)大學(xué)計算機(jī)教育的漏洞,實(shí)在很有必要。2.1空行空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加清晰。空行不會浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會多消耗一些紙張,但是值得。所以不要舍不得用空行。【規(guī)則2-1-1】在每個函數(shù)定義結(jié)束之后都要加空行。參見示例2-1(a)【規(guī)則2-1-2】在一個函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。參見示例2-1(b)/空行void Function1()/空行void Function2()示例2-1(a)函數(shù)之間的空行/空行while (condition)statement1;/空行if (condition)statement2;elsestatement3;/空行statement4;示例2-1(b)函數(shù)內(nèi)部的空行 2.2代碼行【規(guī)則2-2-1】一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。【規(guī)則2-2-2】if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加。這樣可以防止書寫失誤。示例2-2(a)為風(fēng)格良好的代碼行,示例2-2(b)為風(fēng)格不良的代碼行。intwidth;/寬度intheight;/高度intdepth;/深度中間使用TAB鍵控制距離intwidth,height,depth;/寬度高度深度x = a+b; /等號左右用空格控制距離y = c+d;z = e+f;x = a+b;y=c+d;z=e+f;if (width height)/左右用空格控制距離dosomething();/使用TAB鍵控制距離if(width=”、“=”、“+”、“*”、“%”、“&”、“|”、“”這類操作符前后不加空格?!窘ㄗh2-3-1】對于表達(dá)式比較長的for語句和if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭?,如for(i=0;i10;i+)和if(a=b)&(c= 2000)/良好的風(fēng)格if(year=2000)/不良的風(fēng)格if (a=b) & (c=b&c=d)/不良的風(fēng)格for (i=0; i10; i+)/良好的風(fēng)格for(i=0;i10;i+)/不良的風(fēng)格for(I = 0; I 10; I+)/過多的空格x = a b ? a : b;/良好的風(fēng)格x=aFunction();/不要寫成b - Function();示例2-3代碼行內(nèi)的空格2.4對齊【規(guī)則2-4-1】程序的分界符和應(yīng)獨(dú)占一行并且位于同一列,同時與引用它們的語句左對齊?!疽?guī)則2-4-2】之內(nèi)的代碼塊在右邊一個TAB鍵處左對齊。示例2-4(a)為風(fēng)格良好的對齊,示例2-4(b)為風(fēng)格不良的對齊。void Function (int x)/programcodeVoid Function(intx)/programcodeif (condition)/programcodeelse/programcodeif(condition)/programcodeelse/programcodefor (initialization; condition; update)/programcodefor(initialization;condition;update)/programcodewhile (condition)/programcodewhile(condition)/programcode如果出現(xiàn)嵌套的,則使用縮進(jìn)對齊,如:示例2-4(a)風(fēng)格良好的對齊示例2-4(b)風(fēng)格不良的對齊2.5長行拆分z【規(guī)則2-5-1】代碼行最大長度宜控制在70至80個字符以內(nèi)。代碼行不要過長,否則眼睛看不過來,也不便于打印。z【規(guī)則2-5-2】長表達(dá)式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。if (very_longer_variable1 = very_longer_variable12)&(very_longer_variable3 = very_longer_variable14) 使用TAB鍵控制距離&(very_longer_variable5 Draw();/類的成員函數(shù)z【規(guī)則3-1-8】用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。例如:intminValue;intmaxValue;intSetValue();intGetValue();【建議3-1-1】盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上的確需要編號。這是為了防止程序員偷懶,不肯為命名動腦筋而導(dǎo)致產(chǎn)生無意義的名字(因為用數(shù)字編號最省事)。3.2簡單的Windows應(yīng)用程序命名規(guī)則作者對“匈牙利”命名規(guī)則做了合理的簡化,下述的命名規(guī)則簡單易用,比較適合于Windows應(yīng)用軟件的開發(fā)。z【規(guī)則3-2-1】類名和函數(shù)名用大寫字母開頭的單詞組合而成。例如:classNode;/類名classLeafNode;/類名voidDraw(void);/函數(shù)名voidSetValue(int value);/函數(shù)名z【規(guī)則3-2-2】變量和參數(shù)用小寫字母開頭的單詞組合而成。例如:BOOLflag;intdrawMode;z【規(guī)則3-2-3】常量全用大寫的字母,用下劃線分割單詞。例如:const intMAX = 100;const intMAX_LENGTH = 100;z【規(guī)則3-2-4】靜態(tài)變量加前綴s_(表示static)。例如:void Init()static ints_initValue;/靜態(tài)變量z【規(guī)則3-2-5】如果不得已需要全局變量,則使全局變量加前綴g_(表示global)。例如:intg_howManyPeople;/全局變量intg_howMuchMoney;/全局變量z【規(guī)則3-2-6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。例如:Void Object:SetValue(int width, int height)m_width = width;m_height = height; z【規(guī)則3-2-7】為了防止某一軟件庫中的一些標(biāo)識符和其它軟件庫中的沖突,可以為各種標(biāo)識符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所有庫函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。 第4章表達(dá)式和基本語句表達(dá)式和語句都屬于C的短語結(jié)構(gòu)語法。它們看似簡單,但使用時隱患比較多。本章歸納了正確使用表達(dá)式和語句的一些規(guī)則與建議。4.1運(yùn)算符的優(yōu)先級C語言的運(yùn)算符有數(shù)十個,運(yùn)算符的優(yōu)先級與結(jié)合律如表4-1所示。注意一元運(yùn)算符+-*的優(yōu)先級高于對應(yīng)的二元運(yùn)算符。優(yōu)先級運(yùn)算符結(jié)合律從高到低排列()-.從左至右!+-(類型)sizeof+-*&從右至左*/%從左至右+-從左至右從左至右=從左至右=!=從左至右&從左至右從左至右|從左至右&從左至右|從右至左?:從右至左=+=-=*=/=%=&=|=從左至右表4-1運(yùn)算符的優(yōu)先級與結(jié)合律 【規(guī)則4-1-1】如果代碼行中的運(yùn)算符比較多,用括號確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級。由于將表4-1熟記是比較困難的,為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用括號確定表達(dá)式的操作順序。例如:word = (high=b&cd&c+f=g+h;/復(fù)合表達(dá)式過于復(fù)雜【規(guī)則4-2-2】不要有多用途的復(fù)合表達(dá)式。例如:d=(a=b+c)+r;該表達(dá)式既求a值又求d值。應(yīng)該拆分為兩個獨(dú)立的語句:a = b + c;d = a + r;【規(guī)則4-2-3】不要把程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式”混淆。例如:if(abc)/abc是數(shù)學(xué)表達(dá)式而不是程序表達(dá)式并不表示if (ab)&(bc)而是成了令人費(fèi)解的if(ab)=”或“=-EPSINON)&(x=EPSINON)其中EPSINON是允許的誤差(即精度)。4.3.4指針變量與零值比較z【規(guī)則4-3-4】應(yīng)當(dāng)將指針變量用“=”或“!=”與NULL比較。指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但是兩者意義不同。假設(shè)指針變量的名字為p,它與零值比較的標(biāo)準(zhǔn)if語句如下:if(p=NULL)/p與NULL顯式比較,強(qiáng)調(diào)p是指針變量if(p!=NULL)不要寫成if(p=0)/容易讓人誤解p是整型變量if(p!=0)或者if(p)/容易讓人誤解p是布爾變量if(!p)4.3.5對if語句的補(bǔ)充說明有時候我們可能會看到if(NULL=p)這樣古怪的格式。不是程序?qū)戝e了,是程序員為了防止將if(p=NULL)誤寫成if(p=NULL),而有意把p和NULL顛倒。編譯器認(rèn)為if(p=NULL)是合法的,但是會指出if(NULL=p)是錯誤的,因為NULL不能被賦值。程序中有時會遇到if/else/return的組合,應(yīng)該將如下不良風(fēng)格的程序if(condition)returnx;returny;改寫為if(condition)returnx;elsereturny;或者改寫成更加簡練的return(condition?x:y);4.4循環(huán)語句的效率C循環(huán)語句中,for語句使用頻率最高,while語句其次,do語句很少用。本節(jié)重點(diǎn)論述循環(huán)體的效率。提高循環(huán)體效率的基本辦法是降低循環(huán)體的復(fù)雜性。z【建議4-4-1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。例如示例4-4(b)的效率比示例4-4(a)的高。for (row=0; row100; row+)for (col=0; col5; col+)fum = sum+arowcol;示例4-4(a)低效率:長循環(huán)在最外層for (col=0; col5; col+)for (row=0; row100; row+)fum = sum+arowcol;示例4-4(b)高效率:長循環(huán)在最內(nèi)層z【建議4-4-2】如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。示例4-4(c)的程序比示例4-4(d)多執(zhí)行了N-1次邏輯判斷。并且由于前者老要進(jìn)行邏輯判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果N非常大,最好采用示例4-4(d)的寫法,可以提高效率。如果N非常小,兩者效率差別并不明顯,采用示例4-4(c)的寫法比較好,因為程序更加簡潔。 for (i=0; iN; i+)if (conditionDoSomething();elseDoOtherthing();表4-4(c)效率低但程序簡潔if(condition)for(i=0;iN;i+)DoSomething();elsefor(i=0;iN;i+)DoOtherthing();表4-4(d)效率高但程序不簡潔4.5for語句的循環(huán)控制變量z【規(guī)則4-5-1】不可在for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。z【建議4-5-1】建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。示例4-5(a)中的x值屬于半開半閉區(qū)間“0=xN”,起點(diǎn)到終點(diǎn)的間隔為N,循環(huán)次數(shù)為N。示例4-5(b)中的x值屬于閉區(qū)間“0=x=N-1”,起點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。相比之下,示例4-5(a)的寫法更加直觀,盡管兩者的功能是相同的。for(intx=0;xN;x+)示例4-5(a)循環(huán)變量屬于半開半閉區(qū)間for(intx=0;x=N-1;x+)示例4-5(b)循環(huán)變量屬于閉區(qū)間4.6switch語句switch是多分支選擇語句,而if語句只有兩個分支可供選擇。雖然可以用嵌套的if語句來實(shí)現(xiàn)多分支選擇,但那樣的程序冗長難讀。這是switch語句存在的理由。switch語句的基本格式是:switch(variable)case value1:break;case value2:break;default:break;z【規(guī)則4-6-1】每個case語句的結(jié)尾不要忘了加break,否則將導(dǎo)致多個分支重疊(除非有意使多個分支重疊)。z【規(guī)則4-6-2】不要忘記最后那個default分支。即使程序真的不需要default處理,也應(yīng)該保留語句default:break;這樣做并非多此一舉,而是為了防止別人誤以為你忘了default處理。4.7goto語句自從提倡結(jié)構(gòu)化設(shè)計以來,goto就成了有爭議的語句。首先,由于goto語句可以靈活跳轉(zhuǎn),如果不加限制,它的確會破壞結(jié)構(gòu)化設(shè)計風(fēng)格。其次,goto語句經(jīng)常帶來錯誤或隱患。它可能跳過了某些對象的構(gòu)造、變量的初始化、重要的計算等語句,例如:gotostate;Strings1,s2; /被goto跳過intsum = 0;/被goto跳過state:如果編譯器不能發(fā)覺此類錯誤,每用一次goto語句都可能留下隱患。很多人建議廢除C的goto語句,以絕后患。但實(shí)事求是地說,錯誤是程序員自己造成的,不是goto的過錯。goto語句至少有一處可顯神通,它能從多重循環(huán)體中咻地一下子跳到外面,用不著寫很多次的break語句;例如gotoerror; error:就象樓房著火了,來不及從樓梯一級一級往下走,可從窗口跳出火坑。所以我們主張少用、慎用goto語句,而不是禁用。 第5章常量常量是一種標(biāo)識符,它的值在運(yùn)行期間恒定不變。C語言用#define來定義常量(稱為宏常量)。C+語言除了#define外還可以用const來定義常量(稱為const常量)。 5.1為什么需要常量如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會有什么麻煩?(1)程序的可讀性(可理解性)變差。程序員自己會忘記那些數(shù)字或字符串是什么意思,用戶則更加不知它們從何處來、表示什么。(2)在程序的很多地方輸入同樣的數(shù)字或字符串,難保不發(fā)生書寫錯誤。(3)如果要修改數(shù)字或字符串,則會在很多地方改動,既麻煩又容易出錯。z【規(guī)則5-1-1】盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串。例如:#defineMAX100/*C語言的宏常量*/constintMAX=100;/C+語言的const常量constfloatPI=3.14159;/C+語言的const常量5.2const與#define的比較 C+語言可以用const來定義常量,也可以用#define來定義常量。但是前者比后者有更多的優(yōu)點(diǎn):(1)const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查。而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。(2)有些集成化的調(diào)試工具可以對const常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。z【規(guī)則5-2-1】在C+程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。5.3常量定義規(guī)則z【規(guī)則5-3-1】需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為便于管理,可以把不同模塊的常量集中存放在一個公共的頭文件中。z【規(guī)則5-3-2】如果某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不 應(yīng)給出一些孤立的值。例如:constfloatRADIUS=100;constfloatDIAMETER=RADIUS*2; 第6章函數(shù)設(shè)計函數(shù)是C程序的基本功能單元,其重要性不言而喻。函數(shù)設(shè)計的細(xì)微缺點(diǎn)很容易導(dǎo)致該函數(shù)被錯用,所以光使函數(shù)的功能正確是不夠的。本章重點(diǎn)論述函數(shù)的接口設(shè)計和內(nèi)部實(shí)現(xiàn)的一些規(guī)則。函數(shù)接口的兩個要素是參數(shù)和返回值。C語言中,函數(shù)的參數(shù)和返回值的傳遞方式有兩種:值傳遞(passbyvalue)和指針傳遞(passbypointer)。C+語言中多了引用傳遞(passbyreference)。由于引用傳遞的性質(zhì)象指針傳遞,而使用方式卻象值傳遞,初學(xué)者常常迷惑不解,容易引起混亂,請先閱讀6.6節(jié)“引用與指針的比較”。6.1參數(shù)的規(guī)則z【規(guī)則6-1-1】參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字。如果函數(shù)沒有參數(shù),則用void填充。例如:void SetValue(int width, int height);/良好的風(fēng)格void SetValue(int,int);/不良的風(fēng)格float GetValue(void);/良好的風(fēng)格float GetValue();/不良的風(fēng)格z【規(guī)則6-1-2】參數(shù)命名要恰當(dāng),順序要合理。例如編寫字符串拷貝函數(shù)StringCopy,它有兩個參數(shù)。如果把參數(shù)名字起為str1和str2,例如void StringCopy(char *str1,char *str2);那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來??梢园褏?shù)名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個問題,這兩個參數(shù)那一個該在前那一個該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:void StringCopy(char *strSource,char *strDestination);別人在使用時可能會不假思索地寫成如下形式:char str20;StringCopy(str,“HelloWorld”);/參數(shù)順序顛倒z【規(guī)則6-1-3】如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如: void StringCopy(char *strDestination,const char *strSource);z【規(guī)則6-1-4】如果輸入?yún)?shù)以值傳遞的方式傳遞對象,則宜改用“const&”方式來傳遞,這樣可以省去臨時對象的構(gòu)造和析構(gòu)過程,從而提高效率?!窘ㄗh6-1-1】避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在5個以內(nèi)。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯?!窘ㄗh6-1-2】盡量不要使用類型和數(shù)目不確定的參數(shù)。C標(biāo)準(zhǔn)庫函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:int printf(const chat *format,argument);這種風(fēng)格的函數(shù)在編譯時喪失了嚴(yán)格的類型安全檢查。6.2返回值的規(guī)則z【規(guī)則6-2-1】不要省略返回值的類型。C語言中,凡不加類型說明的函數(shù),一律自動按整型處理。這樣做不會有什么好處,卻容易被誤解為void類型。C+語言有很嚴(yán)格的類型安全檢查,不允許上述情況發(fā)生。由于C+程序可以調(diào)用C函數(shù),為了避免混亂,規(guī)定任何C+/C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型。z【規(guī)則6-2-2】函數(shù)名字與返回值類型在語義上不可沖突。違反這條規(guī)則的典型代表是C標(biāo)準(zhǔn)庫函數(shù)getchar。例如:charc;c=getchar();if(c=EOF)按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:int getchar(void);由于c是char類型,取值范圍是-128,127,如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險”人們一般哪里料得到!導(dǎo)致本例錯誤的責(zé)任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者。z【規(guī)則6-2-3】不要將正常值和錯誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回?;仡櫳侠?,C標(biāo)準(zhǔn)庫函數(shù)的設(shè)計者為什么要將getchar聲明為令人迷糊的int類型呢? 他會那么傻嗎?在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結(jié)束標(biāo)志或發(fā)生讀錯誤,它必須返回一個標(biāo)志EOF。為了區(qū)別于正常的字符,只好將EOF定義為負(fù)數(shù)(通常為負(fù)1)。因此函數(shù)getchar就成了int類型。我們在實(shí)際工作中,經(jīng)常會碰到上述令人為難的問題。為了避免出現(xiàn)誤解,我們應(yīng)該將正常值和錯誤標(biāo)志分開。即:正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回。函數(shù)getchar可以改寫成BOOL GetChar(char *c);雖然gechar比GetChar靈活,例如putchar(getchar();但是如果getchar用錯了,它的靈活性又有什么用呢?【建議6-2-1】有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。例如字符串拷貝函數(shù)strcpy的原型:char *strcpy(char *strDest,const char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時函數(shù)的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:charstr20;intlength=strlen(strcpy(str,“HelloWorld”);【建議6-2-2】如果函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯。例如:class String/賦值函數(shù)String &operate=(const String &other);/相加函數(shù),如果沒有friend修飾則只許有一個右側(cè)參數(shù)friendStringoperate+(const String &s1,const String &s2);private:char*m_data;String的賦值函數(shù)operate=的實(shí)現(xiàn)如下:String &String:operate=(const String &other)if(this=&other)return*this;deletem_data; m_data=newcharstrlen(other.data)+1;strcpy(m_data,other.data);return*this;/返回的是*this的引用,無需拷貝過程對于賦值函數(shù),應(yīng)當(dāng)用“引用傳遞”的方式返回String對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return語句要把*this拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。例如:Stringa,b,c;a=b;/如果用“值傳遞”,將產(chǎn)生一次*this拷貝a=b=c;/如果用“值傳遞”,將產(chǎn)生兩次*this拷貝String的相加函數(shù)operate+的實(shí)現(xiàn)如下:Stringoperate+(const String &s1,const String &s2)String temp;deletetemp.data;/temp.data是僅含0的字符串temp.data=newcharstrlen(s1.data)+strlen(s2.data)+1;strcpy(temp.data,s1.data);strcat(temp.data,s2.data);return temp; 對于相加函數(shù),應(yīng)當(dāng)用“值傳遞”的方式返回String對象。如果改用“
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)語文教師線上教學(xué)中學(xué)生差異化教學(xué)問題及改進(jìn)措施
- 三年級數(shù)學(xué)新教材教學(xué)組織計劃
- 小學(xué)二年級看圖寫話周計劃范文
- 快消品行業(yè)精益管理推廣計劃
- 包裝設(shè)計關(guān)鍵技術(shù)問題的識別與控制措施
- 交通運(yùn)輸班組管理培訓(xùn)心得體會
- 2025銀行網(wǎng)絡(luò)安全教育培訓(xùn)計劃
- 自我評價我的自畫像范文
- 應(yīng)急物資供貨計劃
- 利用技術(shù)支持產(chǎn)品設(shè)計學(xué)習(xí)小組計劃
- 2025年視覺傳達(dá)設(shè)計考試試題及答案解析
- 北京昌平霍營街道社區(qū)“兩委”干部儲備人才招募筆試真題2024
- 中國常識課件
- (人教PEP版2025新教材)英語三下期末分單元復(fù)習(xí)課件
- 真需求-打開商業(yè)世界的萬能鑰匙
- 暑假假期安全教育(課件)-小學(xué)生主題班會
- 2024年保密培訓(xùn)課件:員工保密知識要點(diǎn)
- 19S406建筑排水管道安裝-塑料管道
- 汽輪機(jī)廠工業(yè)驅(qū)動技術(shù)介紹
- DB13T 5274-2020 醫(yī)療機(jī)構(gòu)安全生產(chǎn)風(fēng)險管控與隱患排查治理規(guī)范
- 混凝土施工倉面設(shè)計
評論
0/150
提交評論