




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、c語言書寫規(guī)范指南第 1 章文件結(jié)構(gòu)每個(gè)C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序得聲明(declaration),稱為頭文件。另一個(gè)文件用于保存程序得實(shí)現(xiàn) (implementation), 稱為定義 (definition) 文件。C程序得頭文件以“、h”為后綴,C程序得定義文件以“、C”為后綴。1、1 版權(quán)與版本得聲明(1)(2)(3)(4)版權(quán)與版本得聲明位于頭文件與定義文件得開頭 (參見示例 1-1), 主要內(nèi)容有 : 版權(quán)信息。文件名稱 , 標(biāo)識符 , 摘要。當(dāng)前版本號 , 作者 / 修改者 , 完成日期。版本歷史信息。/*copyright(c)2001, 吉林大學(xué)物理學(xué)院無線
2、電*Allrightsreserved 、* 文件名稱 :* 文件標(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_SPk h,頭文件得結(jié)構(gòu)參見示例1-2。1-2-1 】為了防止頭文件被重復(fù)引用 , 應(yīng)當(dāng)用 #
3、ifndef/#define/#endif【規(guī)則 塊?!疽?guī)則 索)。【規(guī)則1-2-2 】用 #include1-2-3 】用 #include結(jié)構(gòu)產(chǎn)生預(yù)處理<>格式來引用標(biāo)準(zhǔn)庫得頭文件 ( 編譯器將從標(biāo)準(zhǔn)庫目錄開始搜格式來引用非標(biāo)準(zhǔn)庫得頭文件 ( 編譯器將從用戶得工作目錄后面使用TAB鍵控制排版。開始搜索 ) ?!疽?guī)則 1-2-4 】 #include【規(guī)則 1-2-5 】頭文件中只存放“聲明”而不存放“定義”【規(guī)則1-2-6】全局變量在頭文件中聲明,在、c文件中定義、 h extern in tvalue;、 c in tvalue=0x10;規(guī)則 1-2-7 】局部變量在 、
4、/ 版權(quán)與版本聲明見示例 #ifndef #define#include聲明。定義。c中定義(static)1-1, 此處省略。 SPI_Hunsigned in tvalue;定義。#includeSCL_SCL_SPI_H <p30f6014A 、/h>SCL_CAN、h”voidFunction1( );/ 全局函數(shù)聲明extern unsign int value;/#endif1、 3 定義文件得結(jié)構(gòu)防止SCL_SPk h被重復(fù)引用/ 引用標(biāo)準(zhǔn)庫得頭文件/全局變量聲明定義文件有三部分內(nèi)容 :(1) 定義文件開頭處得版權(quán)與版本聲明(2) 對一些頭文件得引用。(3) 程序得實(shí)
5、現(xiàn)體 ( 包括數(shù)據(jù)與代碼 ) 。 假設(shè)定義文件得名稱為 SCL_SPI、/ 版權(quán)與版本聲明見示例 #include “ SCL_SPI、 h”/ 全局變量定義 unsign int value = 0x10;/ 全局函數(shù)得實(shí)現(xiàn)體void Function1( )1、 4 頭文件得作用引用非標(biāo)準(zhǔn)庫得頭文件示例1-2C頭文件得結(jié)構(gòu)( 參見示例 1-1) 。c, 定義文件得結(jié)構(gòu)參見示例1-3 。1-1, 此處省略。/ 引用頭文件示例 1-3C 定義文件得結(jié)構(gòu)Fortran 沒有頭文件得概念 ,C 語言得初學(xué)者雖然會用使用頭文件早期得編程語言如 Basic 、但常常不明其理。這里對頭文件得作用略作解釋
6、 :(1) 通過頭文件來調(diào)用庫功能。在很多場合 ,源代碼不便 (或不準(zhǔn) )向用戶公布 ,只要向用戶提供頭文件與二進(jìn)制得庫即可。用戶只需要按照頭文件中得接口聲明來調(diào)用庫功能, 而不必關(guān)心接口怎么實(shí)現(xiàn)得。編譯器會從庫中提取相應(yīng)得代碼。(2) 頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí), 其方式與頭文件中得聲明不一致 , 編譯器就會指出錯誤 , 這一簡單得規(guī)則能大大減輕程序員調(diào)試、改錯得負(fù)擔(dān)。1、 5 目錄結(jié)構(gòu)如果一個(gè)軟件得頭文件數(shù)目比較多 (如超過十個(gè) ), 通常應(yīng)將頭文件與定義文件分別保存于 不同得目錄 , 以便于維護(hù)。例如可將頭文件保存于 include 目錄,將定義文件保存于 s
7、ource 目錄 (可以就是多級目 錄)。如果某些頭文件就是私有得 ,它不會被用戶得程序直接引用 , 則沒有必要公開其“聲明”。 為了加強(qiáng)信息隱藏 , 這些私有得頭文件可以與定義文件存放于同一個(gè)目錄。第 2 章程序得版式,就是程序風(fēng)版式雖然不會影響程序得功能 , 但會影響可讀性。程序得版式追求清晰、美觀 格得重要構(gòu)成因素。, 瞧得興致勃可以把程序得版式比喻為“書法”。好得“書法”可讓人對程序一目了然 勃。差得程序“書法”如螃蟹爬行, 讓人瞧得索然無味 , 更令維護(hù)者煩惱有加。請程序員們學(xué)習(xí)程序得“書法” ,彌補(bǔ)大學(xué)計(jì)算機(jī)教育得漏洞 , 實(shí)在很有必要。2、1 空行空行起著分隔程序段落得作用??招?/p>
8、得體 ( 不過多也不過少 ) 將使程序得布局更加清晰。 空行不會浪費(fèi)內(nèi)存 , 雖然打印含有空行得程序就是會多消耗一些紙張 , 但就是值得。所以不要 舍不得用空行?!疽?guī)則 2-1-1 】在每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見示例 2-1(a)【規(guī)則 2-1-2 】在一個(gè)函數(shù)體內(nèi) ,邏揖上密切相關(guān)得語句之間不加空行 , 其它地方應(yīng)加空行分隔。 參見示例 2-1(b)/ 空行void Function1( )/ 空行void Function2()示例 2-1(a) 函數(shù)之間得空行 / 空行while (condition)statement1;/ 空行if (condition)statement
9、2;elsestatement3;/ 空行 statement4;示例 2-1(b) 函數(shù)內(nèi)部得空行2、2代碼行【規(guī)則2-2-1】一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語句。這樣得代碼容易閱讀 并且方便于寫注釋?!疽?guī)則2-2-2】if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多 少都要加。這樣可以防止書寫失誤。示例2-2(a)為風(fēng)格良好得代碼行,示例2-2(b)為風(fēng)格不良得代碼行。ntwidth;/寬度ntheight;/高度ntdep th;/深度中間使用TAB鍵控制距離intwidth,height,de pth;/寬度高度深度x = a+b
10、; /等號左右用空格控制距離 y = c+d;z = e+f;x = a+b;y=c+d;z=e+f;if (width < height)/<左右用空格控制距離dosomething(); /使用TAB鍵空制距離 if(width<height)dosomething();for (initialization; condition; up date) dosomething(); /使用TAB鍵控制距離/空行other();for(initialization;conditio n;up date) dosomething();other();示例2-2(a)風(fēng)格良好得代
11、碼行示例2-2(b)風(fēng)格不良得代碼行【建議2-2-1】盡可能在定義變量得同時(shí)初始化該變量(就近原則)如果變量得引用處與其定義處相隔比較遠(yuǎn),變量得初始化很容易被忘記。如果引用了未被初例如始化得變量,可能會導(dǎo)致程序錯誤。本建議可以減少隱患。intwidth=10;/定義并初紿化widthintheight=10;/定義并初紿化heightintdepth=10;/定義并初紿化depth使用TAB鍵控制距離2、3代碼行內(nèi)得空格const、virtual【規(guī)則2-3-1】關(guān)鍵字之后要留空格。象const、virtual 、inline 、case等關(guān)鍵字之后至少要留一個(gè)空格,否則無法辨析關(guān)鍵字。象if
12、、for、while等關(guān)鍵字之后應(yīng)留一個(gè)空格再 跟左括號(【規(guī)則2-3-2】【規(guī)則2-3-3】【規(guī)則2-3-4】,以突出關(guān)鍵字。函數(shù)名之后不要留空格,緊跟左括號(,以與關(guān)鍵字區(qū)別。(向后緊跟,)、,'、;'向前緊跟,緊跟處不留空格。 ,'之后要留空格,如Function(x,y,z)。如果;不就是一行得結(jié)束符號其后要留空格 ,女 0 for (in itializati on; con diti on; up date)【規(guī)則2-3-5】賦值操作符、比較操作符、算術(shù)操作符、(亠” (= 、 += >= 、 <=+”O(jiān)邏輯操作符、%'、“ &&
13、amp;'位域操作符、“ II ”、“ <<”等二元操作符得前后應(yīng)當(dāng)加空格?!疽?guī)則2-3-6】一元操作符如“ 不加空格?!疽?guī)則2-3-7】象“”、“、(“ +”“ & (地址運(yùn)算符)等前后(【建議2-3-1】對于表達(dá)式比較長得格,如 for(i=0;i<10;i+)與if(a<=b)&&(c<=d)for-> ”這類操作符前后不加空格。語句與if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛誺oid Fun c1(i nt x,i nt y,i nt z); void Fund (int x,i nt y,i nt z);/良好得風(fēng)格
14、/不良得風(fēng)格if (year >= 2000)/良好得風(fēng)格if(year>=2000)/不良得風(fēng)格if (a>=b) && (c<=d)/良好得風(fēng)格if(a>=b&&c<=d)/不良得風(fēng)格for (i=0; i<10; i+)/良好得風(fēng)格for(i=0;i<10;i+)/不良得風(fēng)格for(I = 0; I < 10; I+)/過多得空格x = a < b ? a : b;/良好得風(fēng)格x=a<b?a:b;/不好得風(fēng)格int *x = &y;/良好得風(fēng)格in t*x=&y;/不良得風(fēng)格
15、array5 = 0;/ 不要寫成 array 5 = 0;a、Function。;/ 不要寫成 a、Function();b-> Function。;/ 不要寫成 b -> Function();示例2-3代碼行內(nèi)得空格2、4對齊【規(guī)則2-4-1】程序得分界符 '與 '應(yīng)獨(dú)占一行并且位于同一列 ,同時(shí)與引用它們得語句左對齊?!疽?guī)則2-4-2】之內(nèi)得代碼塊在 '右邊一個(gè)TAB鍵處左對齊。 示例2-4(a)為風(fēng)格良好得對齊,示例2-4(b)為風(fēng)格不良得對齊。void Function (int x)Void Function(intx) programcode
16、 programcode if (condition)if(condition) programcode programcodeelseelse programcode programcodefor (initialization; condition; up date)for(initialization;conditio n;up date) programcode programcode while (condition)while(condition) programcode programcode 如果出現(xiàn)嵌套得打,則使用縮進(jìn)對齊,如:示例2-4(a)風(fēng)格良好得對齊示例2-4(b)風(fēng)
17、格不良得對齊2、5長行拆分【規(guī)則2-5-1】代碼行最大長度宜控制在70至80個(gè)字符以內(nèi)。代碼行不要過長,否則眼睛瞧不過來,也不便于打印。【規(guī)則2-5-2】長表達(dá)式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出得新行要進(jìn)行適當(dāng)?shù)每s進(jìn),使排版整齊,語句可讀。if (very_ Ion ger_variable1 >= very_lon ger_variable12) &&(very_lon ger_variable3 <= very_ Ion ger_variable14) &&(very_lon ger_variable5
18、 <= very_ Ion ger_variable16)使用TAB鍵控制距離dosomethi ng();Virtual CMatrixCMulti plyMatrix (CMatrixleftMatrix,CMatrixrightMatrix);使用TAB鍵控制距離For (very_lo nger_i nitializatio n; very_lon ger_c on diti on; very_lon ger_ up date)使用TAB鍵控制距離 dosometh in g();示例2-5長行得拆分2、6修飾符得位置修飾符*與&應(yīng)該靠近數(shù)據(jù)類型還就是該靠近變量名,就是個(gè)
19、有爭議得活題。若將修飾符*靠近數(shù)據(jù)類型,例如:int*x;從語義上講此寫法比較直觀,即X就是int類型得指針。上述寫法得弊端就是容易引起誤解,例如:int*x,y;此處y容易被誤解為指針變量。雖然將X與y分行定義可以避免誤解,但并不就是人人都愿意這樣做?!疽?guī)則2-6-1】應(yīng)當(dāng)將修飾符*與&緊靠變量名例如:char intn ame;x,y;/ 此處y不會被誤解為指針2、7注釋C語言得注釋符為“ /*/ ”“”。注釋通常用于:(1)版本、版權(quán)聲明;函數(shù)接口說明;(3)重要得代碼行或段落提示。釋。參見示例2-6 OC+語言中,程序塊得注釋常采用“ /*/ ”,行注釋一般采用雖然注釋有助于理
20、解代碼,但注意不可過多地使用注【規(guī)則2-7-1】注釋就是對代碼得“提示”,而不就是文檔。程序中得注釋不可喧賓奪主,注釋太多了會讓人眼花繚亂。注釋得花樣要少?!疽?guī)則2-7-2】如果代碼本來就就是清楚得,則不必加注釋。否則多此一舉,令人厭煩。例如i+;/i加1,多余得注釋【規(guī)則2-7-4】【規(guī)則2-7-5】【規(guī)則2-7-6】 方?!疽?guī)則2-7-8】于閱讀。/*函數(shù)介紹:*輸入?yún)?shù):*輸出參數(shù):*返回值 :*/Void Function( floatx, floaty, floatz) 【規(guī)則2-7-3】邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)得注釋,以保證注釋與代碼得一致 性。不再有用得注釋要刪除。注
21、釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性。錯誤得注釋不但無益反而有害。 盡量避免在注釋中使用縮寫,特別就是不常用縮寫。注釋得位置應(yīng)與被描述得代碼相鄰,可以放在代碼得上方或右方,不可放在下當(dāng)代碼比較長,特別就是有多重嵌套時(shí),應(yīng)當(dāng)在一些段落得結(jié)束處加注釋,便if()while() /en dofwhile/en dofif示例2-6程序得注釋第3章命名規(guī)則比較著名得命名規(guī)則當(dāng)推 Microsoft公司得“匈牙利”法,該命名規(guī)則得主要思想就是“在變量與函數(shù)名中加入前綴以增進(jìn)人們對程序得理解”。例如所有得字符變量均以ch為前綴,若就是指針變量則追加前綴P。如果一個(gè)變量由ppch開頭,則表明它就是指向字符指針
22、得指針?!靶傺览狈ㄗ畲蟮萌秉c(diǎn)就是煩瑣,例如inti,j,k;floatx,y,乙倘若采用“匈牙利”命名規(guī)則,則應(yīng)當(dāng)寫成intii,ij, ik;/前綴i表示int類型float fX, fY, fZ; /前綴f表示float類型如此煩瑣得程序會讓絕大多數(shù)程序員無法忍受。據(jù)考察,沒有一種命名規(guī)則可以讓所有得程序員贊同,程序設(shè)計(jì)教科書一般都不指定命名規(guī)則。命名規(guī)則對軟件產(chǎn)品而言并不就是“成敗悠關(guān)”得事,我們不要化太多精力試圖發(fā)明世界上最好得命名規(guī)則,而應(yīng)當(dāng)制定一種令大多數(shù)項(xiàng)目成員滿意得命名規(guī)則,并在項(xiàng)目中貫徹實(shí)施。絕對杜絕漢語拼音命名法3、1共性規(guī)則本節(jié)論述得共性規(guī)則就是被大多數(shù)程序員采納得,我
23、們應(yīng)當(dāng)在遵循這些共性規(guī)則得前提下再擴(kuò)充特定得規(guī)則,如3、2節(jié)?!疽?guī)則3-1-1】標(biāo)識符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,不必進(jìn)行“解碼”。標(biāo)識符最好采用英文單詞或其組合,便于記憶與閱讀。切忌使用漢語拼音來命名。程序中得英文單詞一般不會太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確。例如不要把 CurrentValue寫成 NowValue。【規(guī)則3-1-2】標(biāo)識符得長度應(yīng)當(dāng)符合“min-length&&max-information”原則。幾十年前老ANSIC規(guī)定名字不準(zhǔn)超過6個(gè)字符,現(xiàn)今得C不再有此限制。一般來說,長名字能更好地表達(dá)含義,所以函數(shù)名、變量名、類名長達(dá)十幾個(gè)字符不足為怪。那么名字就是否越長
24、 約好?不見得!例如變量名maxval就比maxValueUntilOverflow 好用。單字符得名字也就是有 用得,常見得如i,j,k,m,n,x,y,z 等,它們通常可用作函數(shù)內(nèi)得局部變量。【規(guī)則3-1-3】命名規(guī)則盡量與所采用得操作系統(tǒng)或開發(fā)工具得風(fēng)格保持一致。例如Windows應(yīng)用程序得標(biāo)識符通常采用“大小寫”混排得方式,如AddChild。而Unix應(yīng)用程序得標(biāo)識符通常采用“小寫加下劃線”得方式,如add_child。別把這兩類風(fēng)格混在一起用?!疽?guī)則3-1-4】程序中不要出現(xiàn)僅靠大小寫區(qū)分得相似得標(biāo)識符。例如int x, X; /變量X與X容易混淆 voidfoo(intx); /
25、 函數(shù) foo 與 FOO易混淆 voidFOO(floatx);,盡管兩者得作用域【規(guī)則3-1-5】程序中不要出現(xiàn)標(biāo)識符完全相同得局部變量與全局變量不同而不會發(fā)生語法錯誤,但會使人誤解?!疽?guī)則3-1-6】變量得名字應(yīng)當(dāng)使用“名詞”或者“形容詞+名詞”。例如floatvalue;floatoldValue;floatn ewValue;【規(guī)則3-1-7】全局函數(shù)得名字應(yīng)當(dāng)使用“動詞”或者“動詞+名詞” 員函數(shù)應(yīng)當(dāng)只使用 例如:DrawBox(); box->Draw();(動賓詞組)。類得成“動詞”/,被省略掉得名詞就就是對象本身。全局函數(shù) 類得成員函數(shù)【規(guī)則3-1-8】用正確得反義詞組
26、命名具有互斥意義得變量或相反動作得函數(shù)等。例如intintintint【建議3-1-1】min Value; maxValue; SetValue(); GetValue();編號。這就是為了防止程序員偷懶 數(shù)字編號最省事)。盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上得確需要,不肯為命名動腦筋而導(dǎo)致產(chǎn)生無意義得名字(因?yàn)橛?、2簡單得Windows應(yīng)用程序命名規(guī)則作者對“匈牙利”命名規(guī)則做了合理得簡化,下述得命名規(guī)則簡單易用,比較適合于Windows應(yīng)用軟件得開發(fā)。Node;/ 類名LeafNode; / 類名/函數(shù)名 函數(shù)名【規(guī)則3-2-1】類名與函數(shù)名用大寫字母
27、開頭得單詞組合而成。 例如:classclassvoid Draw(void);void SetValue(i nt value);/【規(guī)則3-2-2】變量與參數(shù)用小寫字母開頭得單詞組合而成。例如BOOLint【規(guī)則3-2-3】flag; drawMode;常量全用大寫得字母,用下劃線分割單詞。例如con st intMAX = 100;con st intMAX_LENGTH = 100;【規(guī)則3-2-4】靜態(tài)變量加前綴s_(表示static)。例如:void In it()static ints_ini tValue;/靜態(tài)變量【規(guī)則3-2-5】如果不得已需要全局變量,則使全局變量加前綴g
28、_(表示global)。例如:intg_howManyPeopie;/ 全局變量intg_howMuchMoney/ / 全局變量【規(guī)則3-2-6】類得數(shù)據(jù)成員加前綴 m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)得參 數(shù)同名。例如:Void Object:SetValue(i nt width, i nt height)m_width = width; m_height = height;【規(guī)則3-2-7】為了防止某一軟件庫中得一些標(biāo)識符與其它軟件庫中得沖突 各種標(biāo)識符加上能反映軟件性質(zhì)得前綴。例如三維圖形標(biāo)準(zhǔn) 頭,所有常量(或宏定義)均以GL開頭。,可以為OpenG得所有庫函數(shù)均
29、以gl開第4章表達(dá)式與基本語句表達(dá)式與語句都屬于 C得短語結(jié)構(gòu)語法。它們瞧似簡單 正確使用表達(dá)式與語句得一些規(guī)則與建議。,但使用時(shí)隱患比較多。本章歸納了4、1運(yùn)算符得優(yōu)先級C 語言得運(yùn)算符有數(shù)十個(gè),運(yùn)算符得優(yōu)先級與結(jié)合律如表 *得優(yōu)先級高于對應(yīng)得二元運(yùn)算符。優(yōu)先級從 咼 到 低 排 列運(yùn)算符結(jié)合律()-> 、從左至右!+-(類型)sizeof+ - * &從右至左* / %從左至右+ -從左至右<< >>從左至右< <= > >=從左至右= !=從左至右&從左至右A從左至右|從左至右&&從左至右II從右至左4
30、-1所示。注意一元運(yùn)算符+?:從右至左= += -= *= /= %=&=A =|= <<= >> =從左至右表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<<8)|low if (a|b)&&(a&c)4、2復(fù)合表達(dá)式如a=b=c=0這樣得表達(dá)式稱為復(fù)合表達(dá)式。允許復(fù)合表達(dá)式存在得理由就是 (1)書寫簡潔;(2)可以提高編
31、譯效率。但要防止濫用復(fù)合表達(dá)式?!疽?guī)則4-2-1】不要編寫太復(fù)雜得復(fù)合表達(dá)式。例如:i=a>=b&&c<d&&c+f<=g+h;/復(fù)合表達(dá)式過于復(fù)雜【規(guī)則4-2-2】不要有多用途得復(fù)合表達(dá)式。例如:d=(a=b+c)+r;該表達(dá)式既求a值又求d值。應(yīng)該拆分為兩個(gè)獨(dú)立得語句:a = b + c; d = a + r;【規(guī)則4-2-3】不要把程序中得復(fù)合表達(dá)式與“真正得數(shù)學(xué)表達(dá)式”混淆。例如 if(a<b<c)/a<b<c就是數(shù)學(xué)表達(dá)式而不就是程序表達(dá)式并不表示if (a<b )&&(b<c)而就
32、是成了令人費(fèi)解得if(a<b)<c)4、3if語句if語句就是C語言中最簡單、最常用得語句,然而很多程序員用隱含錯誤得方式寫if語句。本節(jié)以“與零值比較”為例,展開討論。4、3、1布爾變量與零值比較【規(guī)則4-3-1】不可將布爾變量直接與 TRUE FALSE或者1、0進(jìn)行比較。根據(jù)布爾類型得語義,零值為“假”(記為FALSE),任何非零值都就是“真”(記為TRUE)o TRUE!值究竟就是什么并沒有統(tǒng)一得標(biāo)準(zhǔn)。例如VisualC+將TRUEt義為1,而VisualBasic則將TRU定義為-1。假設(shè)布爾變量名字為flag,它與零值比較得標(biāo)準(zhǔn)if語句如下:if (flag)/ 表示
33、flag 為真if (!flag)/ 表示 flag 為假其它得用法都屬于不良風(fēng)格,例如:if(flag=TRUE)if(flag=1)if(flag=FALSE)if(flag=0)4、3、2整型變量與零值比較【規(guī)則4-3-2】應(yīng)當(dāng)將整型變量用“=”或“!=”直接與0比較。假設(shè)整 型變量得名字為value,它與零值比較得標(biāo)準(zhǔn)if語句如下:if(value=0)if(value!=0)不可模仿布爾變量得風(fēng)格而寫成if(value)/會讓人誤解value就是布爾變量if(!value)4、3、3浮點(diǎn)變量與零值比較【規(guī)則4-3-3】不可將浮點(diǎn)變量用“=”或“!= ”與任何數(shù)字比較。千萬要留意,無論
34、就是float還就是double類型得變量,都有精度限制。所以一定要避免將浮 點(diǎn)變量用“=”或“!= ”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“ >=”或“ <=”形式。假設(shè)浮點(diǎn)變量得名字為 X,應(yīng)當(dāng)將if(x=0、0)/隱含錯誤得比較轉(zhuǎn)化為if(x>=-E PSINO N)&&( x<=E PSINON)其中EPSINOI就是允許得誤差(即精度)。4、3、4指針變量與零值比較【規(guī)則4-3-4】應(yīng)當(dāng)將指針變量用“=”或“!=”與NULL比較。指針變量得零值就是“空”(記為NULL)。盡管NULI得值與0相同,但就是兩者意義不同。假設(shè)指針變量得名字為p,它與零值比較得
35、標(biāo)準(zhǔn)if語句如下:/p與NULL顯式比較,強(qiáng)調(diào)P就是指針變量if(p=NULL) if(p!=NULL) 不要寫成if(p=0)if(p !=0) 或者if(P)if仲)/容易讓人誤解P就是整型變量/容易讓人誤解P就是布爾變量4、3、5對if語句得補(bǔ)充說明有時(shí)候我們可能會瞧到if(NULL=P)這樣古怪得格式。不就是程序?qū)戝e了,就是程序員為了防止將if(p=NULL)誤寫成if(p=NULL),而有意把p與NULL顛倒。編譯器認(rèn)為if(p=NULL) 就是合法得,但就是會指出if(NULL=P)就是錯誤得,因?yàn)镹ULL不能被賦值。程序中有時(shí)會遇到if/else/return 得組合,應(yīng)該將如下
36、不良風(fēng)格得程序if(con diti on)returnx;returny;改寫為if(con diti on) elsereturny;或者改寫成更加簡練得retur n(con diti on? x:y);4、4循環(huán)語句得效率C循環(huán)語句中,for語句使用頻率最高,while語句其次,do語句很少用。本節(jié)重點(diǎn)論述循環(huán)體 得效率。提高循環(huán)體效率得基本辦法就是降低循環(huán)體得復(fù)雜性?!窘ㄗh4-4-1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長得循環(huán)放在最內(nèi)層 ,最短得循環(huán)放 在最外層,以減少CPI跨切循環(huán)層得次數(shù)。例如示例4-4(b)得效率比示例4-4(a)得高。for (row=0; row<10
37、0; row+)for (col=0; col<5; col+)fum = sum+arowcol;示例4-4(a)低效率:長循環(huán)在最外層for (col=0; col<5; col+)for (row=0; row<100; row+)fum = sum+arowcol;示例4-4(b)高效率:長循環(huán)在最內(nèi)層【建議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
38、非常大,最好采用示例4-4(d)得寫法,可以提高效率。如果 N非常小,兩者效率差別并不明顯,采 用示例4-4(c)得寫法比較好,因?yàn)槌绦蚋雍啙?。for (i=0; i<N; i+)if (con diti onDoSomethi ng();elseDoOtherthi ng(); 效率低但程序簡潔 表 4-4(c) if(con diti on) for(i=0;i<N;i+)DoSomethi ng(); elsefor(i=0;i<N;i+)DoOtherth in g();表4-4(d)效率高但程序不簡潔4、5for語句得循環(huán)控制變量【規(guī)則4-5-1】不可在for循環(huán)
39、體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。【建議4-5-1】建議for語句得循環(huán)控制變量得取值采用“半開半閉區(qū)間”寫法。示例4-5(a)中得x值屬于半開半閉區(qū)間“ 0=<x<N” ,起點(diǎn)到終點(diǎn)得間隔為 N,循環(huán)次數(shù)為No 示例4-5(b)中得x值屬于閉區(qū)間“ 0=<x<=N-1 ” ,起點(diǎn)到終點(diǎn)得間隔為 N-1,循環(huán)次數(shù)為No 相比之下,示例4-5(a)得寫法更加直觀,盡管兩者得功能就是相同得。for(i ntx=0;x<N;x+)示例4-5(a)循環(huán)變量屬于半開半閉區(qū)間for(i ntx=0;x<=N-1;x+) 示例4-5(b)循環(huán)變量屬于閉區(qū)間4、6s
40、witch 語句if語句來switch就是多分支選擇語句,而if語句只有兩個(gè)分支可供選擇。雖然可以用嵌套得 實(shí)現(xiàn)多分支選擇,但那樣得程序冗長難讀。這就是 switch語句存在得理由。 switch語句得基本格式就是:switch(variable)casevalue1:break;value2: casebreak;default:break;【規(guī)則4-6-1】每個(gè)case語句得結(jié)尾不要忘了加break,否則將導(dǎo)致多個(gè)分支重疊 非有意使多個(gè)分支重疊)。處理,也應(yīng),而就是為了防止別人誤以為您忘了【規(guī)則4-6-2】不要忘記最后那個(gè)default分支。即使程序真得不需要 default該保留語句de
41、fault:break; 這樣做并非多此一舉default 處理。4、7goto 語句自從提倡結(jié)構(gòu)化設(shè)計(jì)以來,goto就成了有爭議得語句。首先,由于goto語句可以靈活跳轉(zhuǎn), 如果不加限制,它得確會破壞結(jié)構(gòu)化設(shè)計(jì)風(fēng)格。其次,goto語句經(jīng)常帶來錯誤或隱患。它可能跳過了某些對象得構(gòu)造、變量得初始化、重要得計(jì)算等語句,例如:gotostate;Stri ngs1,s2; /被goto跳過intsum = 0;/被goto跳過state:如果編譯器不能發(fā)覺此類錯誤,每用一次goto語句都可能留下隱患。很多人建議廢除 C得goto語句,以絕后患。但實(shí)事求就是地說,錯誤就是程序員自己造成得不就是goto
42、得過錯。goto語句至少有一處可顯神通,它能從多重循環(huán)體中咻地一下子跳到外面用不著寫很多次得break語句;例如 gotoerror; error:就象樓房著火了 ,來不及從樓梯一級一級往下走,可從窗口跳出火坑。所以我們主張少用、 慎用goto語句,而不就是禁用。第5章常量常量就是一種標(biāo)識符,它得值在運(yùn)行期間恒定不變。C語言用#define來定義常量(稱為宏常量)。C+語言除了 #defi ne外還可以用con st來定義常量(稱為con st常量)。5、1為什么需要常量如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會有什么麻煩?(1) 程序得可讀性(可理解性)變差。程序員自己會忘記那些數(shù)字
43、或字符串就是什么意思更加不知它們從何處來、表示什么。(2) 在程序得很多地方輸入同樣得數(shù)字或字符串,難保不發(fā)生書寫錯誤。(3) 如果要修改數(shù)字或字符串,則會在很多地方改動,既麻煩又容易出錯?!勘M量使用含義直觀得常量來表示那些將在程序中多次出現(xiàn)得數(shù)字或字符,用戶則【規(guī)則5-1-1串。例如:#defi ne con sti nt con stfloat/*C語言得宏常量*/ C+ 語言得const常量MAX 100MAX=100;Pl=3、14159;/ C+ 語言得 const 常量5、2const 與 #define 得比較C+語言可以用con st來定義常量,也可以用#defi ne來定義常
44、量。但就是前者比后者有更多得優(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)試?!疽?guī)則5-2-1】在C+程序中只使用const常量而不使用宏常量,即con st常量完全取代宏常 量。5、3常量定義規(guī)則【規(guī)則5-3-1】需要對外公開得常量放在頭文件中,不需要對外公開得常量放在定義文件得頭部。為便于管理,可以把不同模塊得常量集中存放在一個(gè)公共得頭文件中?!疽?guī)則5-3-2】如果
45、某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立得值。例如:const floatRADIUS=100;con st floatDIAMETER=RADIUS*2;第6章函數(shù)設(shè)計(jì)函數(shù)就是C程序得基本功能單元,其重要性不言而喻。函數(shù)設(shè)計(jì)得細(xì)微缺點(diǎn)很容易導(dǎo)致該 函數(shù)被錯用,所以光使函數(shù)得功能正確就是不夠得。本章重點(diǎn)論述函數(shù)得接口設(shè)計(jì)與內(nèi)部實(shí) 現(xiàn)得一些規(guī)則。函數(shù)接口得兩個(gè)要素就是參數(shù)與返回值。C語言中,函數(shù)得參數(shù)與返回值得傳遞方式有兩種:值傳遞(p assbyvalue)與指針傳遞(p assby poin ter)。 C+語言中多了引用傳遞(passbyreferenee)。
46、由于引用傳遞得性質(zhì)象指針傳遞,而使用方式卻象值傳遞,初學(xué)者常常迷惑不解,容易引起混亂,請先閱讀6、6節(jié)“引用與指針得比較”。6、1參數(shù)得規(guī)則【規(guī)則6-1-1】參數(shù)得書寫要完整,不要貪圖省事只寫參數(shù)得類型而省略參數(shù)名字。如果函 數(shù)沒有參數(shù),則用void填充。良好得風(fēng)格 /不良得風(fēng)格/良好得風(fēng)格/不良得風(fēng)格,順序要合理。例如:void SetValue(i nt width,i nt height);/void SetValue( in t,i nt);float GetValue(void); float GetValue();【規(guī)則6-1-2】參數(shù)命名要恰當(dāng)例如編寫字符串拷貝函數(shù)StringC
47、opy,它有兩個(gè)參數(shù)。如果把參數(shù)名字起為str1與str2,例如void Strin gCo py(char *str1,char *str2);那么我們很難搞清楚究竟就是把str1拷貝到str2中,還就是剛好倒過來??梢园褏?shù)名字起得更有意義,如叫strSource與strDestination。這樣從名字上就可以瞧出應(yīng)該把 strSource 拷貝到 strDestination。還有一個(gè)問題,這兩個(gè)參數(shù)那一個(gè)該在前那一個(gè)該在后?參數(shù)得順序要遵循程序員得習(xí)慣。 一般地,應(yīng)將目得參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:void StringCopy (char *strSource,
48、char *strDest in ati on);別人在使用時(shí)可能會不假思索地寫成如下形式:char str20;StringCopy(str,“HelloWorld ”);/ 參數(shù)順序顛倒【規(guī)則6-1-3】如果參數(shù)就是指針,且僅作輸入用,則應(yīng)在類型前加con st,以防止該指針在 函數(shù)體內(nèi)被意外修改。例如:void StringCopy (char *strDest in ati on,const char *strSource);【規(guī)則6-1-4】如果輸入?yún)?shù)以值傳遞得方式傳遞對象,則宜改用“ const& ”方式來傳遞,這樣可以省去臨時(shí)對象得構(gòu)造與析構(gòu)過程,從而提高效率。【建議6
49、-1-1】避免函數(shù)有太多得參數(shù),參數(shù)個(gè)數(shù)盡量控制在 5個(gè)以內(nèi)。如果參數(shù)太多,在使 用時(shí)容易將參數(shù)類型或順序搞錯?!窘ㄗh6-1-2】盡量不要使用類型與數(shù)目不確定得參數(shù)。C標(biāo)準(zhǔn)庫函數(shù)printf就是采用不確定參數(shù)得典型代表,其原型為:int prin tf(c onst chat*format,argume nt );這種風(fēng)格得函數(shù)在編譯時(shí)喪失了嚴(yán)格得類型安全檢查。6、2返回值得規(guī)則【規(guī)則6-2-1】不要省略返回值得類型。C 語言中,凡不加類型說明得函數(shù),一律自動按整型處理。這樣做不會有什么好處,卻容易被誤解為void類型。C+語言有很嚴(yán)格得類型安全檢查 ,不允許上述情況發(fā)生。由于 C+程序可以調(diào)
50、用C函數(shù), 為了避免混亂,規(guī)定任何C+/C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型?!疽?guī)則6-2-2】函數(shù)名字與返回值類型在語義上不可沖突。違反這條規(guī)則得典型代表就是 (標(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語句將總就是失敗,這種
51、“危險(xiǎn)”人們一般哪里料得到!導(dǎo)致本例錯誤得責(zé)任并不在 用戶,就是函數(shù)getchar誤導(dǎo)了使用者。,而錯誤標(biāo)【規(guī)則6-2-3】不要將正常值與錯誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得 志用return語句返回?;仡櫳侠?C標(biāo)準(zhǔn)庫函數(shù)得設(shè)計(jì)者為什么要將getchar聲明為令人迷糊得int類型呢?她會那么傻嗎?在正常情況下,getchar得確返回單個(gè)字符。但如果 getchar碰到文件結(jié)束標(biāo)志或發(fā)生讀錯誤 它必須返回一個(gè)標(biāo)志EOF為了區(qū)別于正常得字符,只好將EO定義為負(fù)數(shù)(通常為負(fù)1)。因此函數(shù)getchar就成了 int類型。我們在實(shí)際工作中,經(jīng)常會碰到上述令人為難得問題。為了避免出現(xiàn)誤解,我們應(yīng)
52、該將正常值與錯誤標(biāo)志分開。即:正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回。函數(shù) getchar 可以改寫成 BOOL GetChar(char *c);雖然gechar比GetChar靈活,例如putchar(getchar(); 但就是如果getchar用錯了,它得靈 活性又有什么用呢?【建議6-2-1】有時(shí)候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。例如字符串拷貝函數(shù)strcpy得原型:char *strc py (char *strDest,c onst char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時(shí)
53、函數(shù)得返回值又就是strDest。這樣做并非多此一舉,可以獲得如下靈活性:charstr20;intlength=strlen(strcpy(str,“HelloWorld ” );【建議6-2-2】如果函數(shù)得返回值就是一個(gè)對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯。例如:class String/賦值函數(shù)String &op erate=(c onst String &other);II相加函數(shù),如果沒有friend修飾則只許有一個(gè)右側(cè)參數(shù)friend Stringop erate+(c onst String &s1,c onst String &s2);p rivate: char*m_data;String得賦值函數(shù)operate=得實(shí)現(xiàn)如下:String &Stri ng:
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 危險(xiǎn)品管理對噪聲振動和輻射的管理和控制要求考核試卷
- 服裝設(shè)計(jì)人體工學(xué)原理考核試卷
- 批發(fā)業(yè)采購談判技巧與策略考核試卷
- 機(jī)床功能部件在虛擬現(xiàn)實(shí)設(shè)備中的交互式設(shè)計(jì)考核試卷
- 有機(jī)肥料在土壤侵蝕控制與生態(tài)恢復(fù)中的應(yīng)用考核試卷
- 兒童情商培訓(xùn)課件
- 代加工合同范本簡單
- 燈具采購標(biāo)準(zhǔn)合同范本
- 簡易的物業(yè)合同范本
- 助學(xué)贈與合同范本
- 2025年中智集團(tuán)及下屬單位招聘筆試參考題庫含答案解析
- 廣東2025年高中化學(xué)學(xué)業(yè)水平考試模擬試卷試題(含答案詳解)
- 《兔的飼養(yǎng)管理》課件
- 2024年中國牛排2市場調(diào)查研究報(bào)告
- 2025年事業(yè)單位考試(綜合管理類A類)綜合應(yīng)用能力試題及解答參考
- 科創(chuàng)板知識題庫試題及答案
- UL1450標(biāo)準(zhǔn)中文版-2019電動空氣壓縮機(jī)真空泵和涂裝設(shè)備中文版第四版
- “互聯(lián)網(wǎng)+”大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽計(jì)劃書一等獎
- 四川政采評審專家入庫考試基礎(chǔ)題練習(xí)試題附答案
- 物業(yè)社區(qū)文化活動培訓(xùn)
- 采購員工作總結(jié)
評論
0/150
提交評論