程序代碼的化課件_第1頁(yè)
程序代碼的化課件_第2頁(yè)
程序代碼的化課件_第3頁(yè)
程序代碼的化課件_第4頁(yè)
程序代碼的化課件_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

華僑大學(xué)計(jì)算機(jī)學(xué)院第七章程序代碼的文檔化

C++/C編程規(guī)范——幫助程序員一次性編寫出高質(zhì)量的程序參考《高質(zhì)量C/C++編程》

目錄0.編程老手和高手的誤區(qū)1.程序的版式2.命名規(guī)則3.表達(dá)式和基本語(yǔ)句4.函數(shù)設(shè)計(jì)5.內(nèi)存管理6.C++/C試題與答案,代碼檢查表引子——“真正”的程序員

(1)

真正的程序員沒(méi)有進(jìn)度表,只有討好領(lǐng)導(dǎo)的馬屁精才有進(jìn)度表,真正的程序員會(huì)讓領(lǐng)導(dǎo)提心吊膽。(2)

真正的程序員不寫使用說(shuō)明書(shū),用戶應(yīng)當(dāng)自己去猜想程序的功能。(3)

真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當(dāng)然也很難讀。(4)

真正的程序員不畫流程圖,原始人和文盲才會(huì)干這事。(5)

真正的程序員不看參考手冊(cè),新手和膽小鬼才會(huì)看。(6)

真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。(7)

真正的程序員認(rèn)為自己比用戶更明白用戶需要什么。(8)

真正的程序員不接受團(tuán)隊(duì)開(kāi)發(fā)的理念,除非他自己是頭頭。(9)

真正的程序員的程序不會(huì)在第一次就正確運(yùn)行,但是他們?cè)敢馐刂鴻C(jī)器進(jìn)行若干個(gè)30小時(shí)的調(diào)試改錯(cuò)。(10)真正的程序員不會(huì)在上午9:00到下午5:00之間工作,如果你看到他在上午9:00工作,這表明他從昨晚一直干到現(xiàn)在。引子——每一個(gè)小函數(shù)都需要考慮:面試題:strcpy的代碼。一位“高手”面對(duì)微軟資深工程師的面試(1)編程風(fēng)格;(2)出錯(cuò)處理;(3)算法復(fù)雜度分析(用于提高性能)1.程序的版式——代碼規(guī)范1)文件結(jié)構(gòu)

版權(quán)和版本頭文件的結(jié)構(gòu)頭文件的作用目錄結(jié)構(gòu)includesrc2)版式a.版權(quán)和版本的聲明1.1版權(quán)和版本的聲明——位于頭文件和定義文件的開(kāi)頭(1)版權(quán)信息。(2)文件名稱,標(biāo)識(shí)符,摘要(3)當(dāng)前版本號(hào),作者/修改者,完成日期。(4)版本歷史信息。/*Copyright(c)2001,上海貝爾有限公司*Allrightsreserved.**文件名稱:filename.h*文件標(biāo)識(shí):見(jiàn)配置管理計(jì)劃書(shū)*摘要:簡(jiǎn)要描述本文件的內(nèi)容**當(dāng)前版本:1.1*作者:輸入作者(或修改者)名字*完成日期:2001年7月20日**取代版本:1.0*原作者:輸入原作者(或修改者)名字*完成日期:2001年5月10日*/b.頭文件的結(jié)構(gòu)//版權(quán)和版本聲明見(jiàn)示例1-1,此處省略。#ifndefGRAPHICS_H//防止raphics.h被重復(fù)引用#defineGRAPHICS_H#include<math.h> //引用標(biāo)準(zhǔn)庫(kù)的頭文件…#include“myheader.h”//引用非標(biāo)準(zhǔn)庫(kù)的頭文件…voidFunction1(…); //全局函數(shù)聲明…classBox //類結(jié)構(gòu)聲明{…};#endif(1)版權(quán)和版本(2)預(yù)處理塊。(3)函數(shù)和類聲明

#include<filename.h>

#include“filename.h”

的區(qū)別//不提倡使用全局變量,少定義

正確使用include,ifndef/define/endifc.頭文件的作用通過(guò)頭文件來(lái)調(diào)用庫(kù)功能。出于安全的考慮:在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可。用戶只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼。2)程序的版式程序的版式程序的書(shū)法一目了然1)適時(shí)加空行:不浪費(fèi)內(nèi)存——?jiǎng)e不舍得用!每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后加空行2)代碼:一行一句易讀、便于設(shè)斷點(diǎn)測(cè)試?yán)?)用空格分隔關(guān)鍵字后、二元運(yùn)算符后要留空格一元運(yùn)算符不留空函數(shù)名后()[]前后不用空格例4)注意{}對(duì)齊例5)長(zhǎng)行拆分一行控制在70至80個(gè)字符以內(nèi),便于觀看、打印6)注釋的使用例:7)類的定義先操作再數(shù)據(jù)例例:一行一句intwidth; //寬度intheight; //高度intdepth; //深度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();}if(width<height)dosomething();良好風(fēng)格易讀、便于設(shè)斷點(diǎn)測(cè)試不良風(fēng)格返回例:用空格分隔,提高可讀性voidFunc1(intx,inty,intz);//良好的風(fēng)格voidFunc1(int

x,int

y,intz);//不良的風(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++)//過(guò)多的空格x=a<b?a:b;//良好的風(fēng)格x=a<b?a:b;//不好的風(fēng)格int*x=&y;//良好的風(fēng)格int*x=&y;//不良的風(fēng)格

返回例:對(duì)齊的兩種方式voidFunction(intx){…//programcode}voidFunction(intx){…//programcode}風(fēng)格不良,但是也有很多工具使用返回例:注釋注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說(shuō)明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過(guò)多使用注釋

/**函數(shù)介紹:*輸入?yún)?shù):*輸出參數(shù):*返回值:*/voidFunction(floatx,floaty,floatz){…}//下面為XX算法if(…){…while(…){…}//endofwhile…}//endofif例:類的定義你的習(xí)慣是什么?先數(shù)據(jù)? 先定義操作?classA{

private:

inti,j;floatx,y;…public:voidFunc1(void);voidFunc2(void);…}classA{

public:voidFunc1(void);voidFunc2(void);…private:inti,j;floatx,y;…}用戶最關(guān)心的是接口,誰(shuí)愿意先看到一堆私有數(shù)據(jù)成員!2.命名規(guī)則

機(jī)構(gòu)內(nèi)部一致即可(一般原則:)直觀拼讀,可望文知意,不必“解碼”。名字的長(zhǎng)度:min-length&&max-information原則

與操作系統(tǒng)和開(kāi)發(fā)工具的風(fēng)格保持一致

不出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符

不出現(xiàn)標(biāo)識(shí)符完全相同的局部變量和全局變量

變量名:“名詞”或“形容詞+名詞”

全局函數(shù)名字:“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)。類的成員函數(shù)應(yīng)只用“動(dòng)詞”,被省略掉的名詞就是對(duì)象本身。

用反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)

避免名字中出現(xiàn)數(shù)字編號(hào),如Value1,Value2等,除非邏輯上的確需要編號(hào)簡(jiǎn)單的Windows應(yīng)用程序命名規(guī)則【1】類名和函數(shù)名用大寫字母開(kāi)頭【2】變量和參數(shù)用小寫字母開(kāi)頭【3】常量全用大寫的字母,下劃線分割單詞。【4】靜態(tài)變量加前綴s_(表示static)?!?】全局變量前加前綴g_(表global)【6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名?!?】類名和函數(shù)名用大寫字母開(kāi)頭的單詞組合而成。例如:

classNode; //類名

classLeafNode; //類名

voidDraw(void); //函數(shù)名

voidSetValue(intvalue); //函數(shù)名返回【2】變量和參數(shù)用小寫字母開(kāi)頭的單詞組合例如:

BOOLflag;

int

drawMode;返回【3】常量全用大寫的字母,用下劃線分割單詞。例如:

constint

MAX=100; constint

MAX_LENGTH=100;返回【4】靜態(tài)變量加前綴s_(表示static)例如:voidInit(…){ staticint

s_initValue; //靜態(tài)變量

…}返回【5】全局變量加前綴g_如果不得已需要全局變量,則使全局變量加前綴g_(表示global)。例如:int

g_howManyPeople; //全局變量int

g_howMuchMoney; //全局變量返回【6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。例如:

voidObject::SetValue(intwidth,intheight) {

m_width=width;

m_height=height;}3.表達(dá)式和基本語(yǔ)句3.1表達(dá)式3.2你會(huì)編寫正確的if語(yǔ)句嗎3.3循環(huán)語(yǔ)句3.1表達(dá)式不要考驗(yàn)我的記性??!拒絕復(fù)雜的復(fù)合表達(dá)式多用括號(hào)代碼行中的運(yùn)算符多時(shí),用括號(hào)確定表達(dá)式的操作順序避免使用默認(rèn)的優(yōu)先級(jí)i++++i;if(a>=b&&c<d&&c+f<=g+h)(

)

(

)

(

)3.2你會(huì)編寫正確的if語(yǔ)句嗎布爾變量與零值比較?

整型變量與零值比較?

浮點(diǎn)變量與零值比較?

指針變量與零值比較?

(1)布爾變量與零值比較?不可將布爾變量直接與TRUE、FALSE或1、0比較布爾類型的語(yǔ)義,零值為“假”(FALSE),任何非零即“真”(TRUE)if(flag==TRUE) if(flag==1) if(flag==FALSE) if(flag==0)

if(flag)

//表示flag為真if(!flag)//表示flag為假(2)整型變量與零值比較?應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。假設(shè)整型變量為value,與零值比較:if(value)if(!value)//不可模仿布爾變量的風(fēng)格而寫成會(huì)讓人誤解value是布爾變量

if(value==0)if(value!=0)(3)浮點(diǎn)變量與零值比較?不可將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。無(wú)論是float還是double類型的變量,都有精度限制一定要避免將浮點(diǎn)變量用“==”或“!=”與數(shù)字比較,應(yīng)設(shè)法轉(zhuǎn)化成“>=”或“<=”形式。若float型浮點(diǎn)變量名為x,應(yīng)將if(x==0.0)//隱含錯(cuò)誤的比較#defineEPSINON

0.000001

if((x>=-EPSINON)&&(x<=EPSINON))//其中EPSINON是允許的誤差(即精度)(4)指針變量與零值比較?應(yīng)當(dāng)將指針變量用“==”或“!=”與NULL比較。指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但兩者意義不同。假設(shè)指針變量的名字為p

if(p==NULL)或if(p!=NULL)

//p與NULL顯式比較,強(qiáng)調(diào)p是指針變量不要寫成

if(p==0)

//容易讓人誤解p是整型變量

if(p!=0)

if(p) //容易讓人誤解p是布爾變量

if(!p)3.3循環(huán)語(yǔ)句多重循環(huán),若可能,應(yīng)長(zhǎng)循環(huán)在內(nèi),短循環(huán)在外以減少CPU跨切循環(huán)層的次數(shù)。

若循環(huán)體內(nèi)有邏輯判斷,且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體外

循環(huán)控制變量采用“半開(kāi)半閉區(qū)間”寫法。即:x介于[0,N)for(intx=0;x<N;x++)而不是

x介于[0,N-1]for(intx=0;x<=N-1;x++)4.函數(shù)設(shè)計(jì)函數(shù)體的“入口處”和“出口處”把關(guān)

4.1參數(shù)4.2返回值4.1參數(shù)的規(guī)則參數(shù)寫完整、命名恰當(dāng)、順序合理StringCopy(char*str1,char*str2)類型和參數(shù)名都要寫參為指針,若僅傳入數(shù)據(jù),則加const參數(shù)個(gè)數(shù)<5個(gè)4.2返回值的規(guī)則返回值類型別省略。正常值——輸出參數(shù)獲得錯(cuò)誤標(biāo)志——用return返回為增加靈活性支持鏈?zhǔn)奖磉_(dá),可附加返回值

char*strcpy(char*strDest,constchar*strSrc);明確說(shuō)明用于出錯(cuò)處理的返回值讓使用者不容易忽視或誤解錯(cuò)誤情況4.函數(shù)設(shè)計(jì)一些建議函數(shù)的功能要單一函數(shù)體<50行檢查所有進(jìn)入函數(shù)體的變量的有效性,1)輸入?yún)?shù)2)通過(guò)其他途徑進(jìn)入函數(shù)體內(nèi)的變量如全局變量、文件句柄等。

4.5使用斷言使用斷言捕捉不應(yīng)該發(fā)生的非法情況。如:函數(shù)入口處,用斷言檢查參數(shù)的有效性。

void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){

assert((pvTo!=NULL)&&(pvFrom!=NULL));

//使用斷言…}

5.內(nèi)存管理5.2常見(jiàn)的內(nèi)存錯(cuò)誤&對(duì)策5.4free和delete把指針怎么啦?5.5動(dòng)態(tài)內(nèi)存會(huì)被自動(dòng)釋放嗎?5.6杜絕野指針5.7有了malloc/free為什么還要new/delete5.8內(nèi)存耗盡怎么辦?5.1內(nèi)存分配方式1靜態(tài)存儲(chǔ)區(qū)域內(nèi)存在程序編譯的時(shí)候就已分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。如全局變量,static變量。2.棧函數(shù)執(zhí)行時(shí)創(chuàng)建,函數(shù)結(jié)束時(shí)自動(dòng)被釋放棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。如:函數(shù)內(nèi)局部變量、參數(shù)的存儲(chǔ)單元3.堆(動(dòng)態(tài)內(nèi)存分配)Malloc/free或new/delete運(yùn)行時(shí)用malloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由我們決定,使用靈活,但問(wèn)題也最多。5.2常見(jiàn)的內(nèi)存錯(cuò)誤&對(duì)策內(nèi)存分配未成功,卻使用了它。內(nèi)存分配雖然成功,但尚未初始化就引用它。內(nèi)存分配成功并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界。忘記了釋放內(nèi)存,造成內(nèi)存泄漏。釋放了內(nèi)存卻繼續(xù)使用它內(nèi)存分配成功了?未成功那你敢就用它?申請(qǐng)的內(nèi)存初始化了么?成功未成功操作越界了么?是的成了野指針內(nèi)存你釋放了么?我忘了內(nèi)存泄漏,資源崩潰釋放了,你還用!我忘了對(duì)策內(nèi)存分配成功了?申請(qǐng)的內(nèi)存初始化了么?避免越界內(nèi)存你釋放了么?釋放了,你還用!用malloc或new申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL內(nèi)存別忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為有值使用。避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作。動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏。用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防產(chǎn)生“野指針”。5.4free和delete把指針怎么啦?它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒(méi)有把指針本身干掉。指針p被free以后其地址仍然不變(非NULL),只是該地址對(duì)應(yīng)的內(nèi)存是垃圾,p成了“野指針”。如果此時(shí)不把p設(shè)置為NULL,會(huì)讓人誤以為p是個(gè)合法的指針。如果程序比較長(zhǎng),我們有時(shí)記不住p所指的內(nèi)存是否已經(jīng)被釋放,在繼續(xù)使用p之前,通常會(huì)用語(yǔ)句if

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論