C、C++編碼規(guī)范資料_第1頁(yè)
C、C++編碼規(guī)范資料_第2頁(yè)
C、C++編碼規(guī)范資料_第3頁(yè)
C、C++編碼規(guī)范資料_第4頁(yè)
C、C++編碼規(guī)范資料_第5頁(yè)
已閱讀5頁(yè),還剩36頁(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)介

文件編號(hào):4-03/1.0

分冊(cè)號(hào):1/1

頁(yè)碼:

密級(jí):1.0

C/C++編碼規(guī)范

XXXXX公司

二00二年十一月

文件變更記錄

*A-增加M-修改D-刪節(jié)

變更圖表、表

日期A/M/D原因與修改情況描述修訂人審核人

版本格、段落號(hào)

1.02002/A第一版XXXXXX

11/15

目錄

1文件結(jié)構(gòu).........................................................1

1.1版權(quán)和版本的聲明...............................................1

1.2頭文件的結(jié)構(gòu)...................................................2

1.3定義文件的結(jié)構(gòu).................................................3

1.4頭文件的作用...................................................3

1.5目錄結(jié)構(gòu).......................................................3

2程序的版式.......................................................4

2.1版式...........................................................4

2.2代碼行.........................................................5

2.3代碼行內(nèi)的空格.................................................6

2.4對(duì)齊...........................................................7

2.5長(zhǎng)行拆分.......................................................7

2.6修飾符的位置...................................................8

2.7注釋...........................................................8

2.8類的版式......................................................10

3命名規(guī)則........................................................10

3.1共性規(guī)則......................................................11

3.2簡(jiǎn)單的出NDOWS應(yīng)用程序命名規(guī)則..................................12

4表達(dá)式和基本語(yǔ)句................................................13

4.1運(yùn)算符的優(yōu)先級(jí).................................................13

4.2復(fù)合表達(dá)式.....................................................14

4.3IE語(yǔ)句........................................................15

4.3.1布爾變量與零值比較..........................................15

4.3.2整型變量與零值比較..........................................15

4.3.3浮點(diǎn)變量與零值比較..........................................16

4.3.4指針變量與零值比較..........................................16

4.3.5對(duì)if語(yǔ)句的補(bǔ)充說(shuō)明........................................16

4.4循環(huán)語(yǔ)句的效率................................................17

4.5FOR語(yǔ)句的循環(huán)控制變量.........................................18

4.6SWITCH語(yǔ)句....................................................18

4.7GOTO語(yǔ)句......................................................19

5常量............................................................19

5.1為什么需要常量................................................20

5.2CONST與#DEFINE的比較..........................................20

5.3常量定義規(guī)則..................................................20

5.4類中的常量....................................................21

6函數(shù)設(shè)計(jì)........................................................22

6.1參數(shù)的規(guī)則....................................................22

6.2返回值的規(guī)則..................................................23

6.3函數(shù)內(nèi)部實(shí)現(xiàn)的規(guī)則............................................25

6.4其它建議......................................................27

6.5使用斷言......................................................27

6.6引用與指針的比較..............................................28

7C/C++代碼審查程式文件...........................................30

前言

世上不存在最好的編程風(fēng)格,一切因需求而定。團(tuán)隊(duì)開發(fā)講究風(fēng)格一致,

如果制定了大家認(rèn)可的編程風(fēng)格,那么所有組員都要遵守。如果各位同事覺得

本文的編程風(fēng)格比較合你的工作,那么就采用它,不要只看不做。人在小時(shí)候

說(shuō)話發(fā)音不準(zhǔn),寫字潦草,如果不改正,總有后悔的時(shí)候。編程也是同樣道理。

本文應(yīng)金融事業(yè)部質(zhì)控總監(jiān)徐建一要求整理編寫,作為金融事業(yè)部C/C++

編碼的試行格式規(guī)范草稿。希望能夠在實(shí)施過程中,得到各位編程高手和資深

專家的指點(diǎn),不斷的改進(jìn),形成適合部門需要,并且能夠的得到部門所有編程

人員認(rèn)可的編程規(guī)范。

本文以上海貝爾林銳博士的《高質(zhì)量C++/C編程指南》為底稿,參考了中

間件公司牛文強(qiáng)的《C++編程規(guī)范》,brianw.kernighan的《程序設(shè)計(jì)實(shí)踐》

等書。

XXX公司1

1文件結(jié)構(gòu)

每個(gè)C++/C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的聲明

(declaration),稱為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)

(implementation),稱為定義(definition)文件。

C++/C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴,

C++程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”

為后綴)。

1.1版權(quán)和版本的聲明

版權(quán)和版本的聲明位于頭文件和定義文件的開頭(參見示例1-1),主要內(nèi)

容有:

(1)版權(quán)信息。

(2)文件名稱,標(biāo)識(shí)符,摘要。

(3)當(dāng)前版本號(hào),作者/修改者,完成日期。

(4)版本歷史信息。

/*

*Copyright(c)2001:中創(chuàng)軟件工程股份有限公司金融事業(yè)部

*Allrightsreserved.

*

*文件名稱:filename,h

*文件標(biāo)識(shí):見配置管理計(jì)劃書

*摘要:簡(jiǎn)要描述本文件的內(nèi)容

*

*當(dāng)前版本:L1

*作者:輸入作者(或修改者)名字

*完成日期:2001年7月20日

*

*取代版本:1.0

*原作者:輸入原作者(或修改者)名字

*完成日期:2001年5月10日

*/

示例1-1版權(quán)和版本的聲明

XXX公司1

1.2頭文件的結(jié)構(gòu)

頭文件由二部分內(nèi)容組成:

(1)頭文件開頭處的版權(quán)和版本聲明(參見示例1-1)。

(2)預(yù)處理塊。

(3)函數(shù)和類結(jié)構(gòu)聲明等。

假設(shè)頭文件名稱為graphics,h,頭文件的結(jié)構(gòu)參見示例1-2。

【規(guī)則1-2T】為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif

結(jié)構(gòu)產(chǎn)生預(yù)處理塊。

【規(guī)貝U1-2-2】用#inchidefilename.h>格式來(lái)引用標(biāo)準(zhǔn)庫(kù)的頭文件(編

譯器將從標(biāo)準(zhǔn)庫(kù)目錄開始搜索)。

【規(guī)則1-2-3】用?一」€10“filename.h”格式來(lái)引用非標(biāo)準(zhǔn)庫(kù)的頭文件

(編譯器將從用戶的工作目錄開始搜索)。

【建議頭文件中只存放“聲明”而不存放“定義”

在C++語(yǔ)法中,類的成員函數(shù)可以在聲明的同時(shí)被定義,并且自動(dòng)成為內(nèi)聯(lián)

函數(shù)。

這雖然會(huì)帶來(lái)書寫上的方便,但卻造成了風(fēng)格不一致,弊大于利。建議將成

員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小。

【建議1-2-2]不提倡使用全局變量,盡量不要在頭文件中出現(xiàn)象extern

intvalue這類聲明。

//版權(quán)和版本聲明見示例1-1,此處省略。

ttifndefGRAPHICS_H//防止graphics上被重復(fù)引用

^defineGRAPHICSJ

^include<math.h>//引用標(biāo)準(zhǔn)庫(kù)的頭文件

ttinclude“myhcadcr.h”〃引用非標(biāo)準(zhǔn)庫(kù)的頭文件

???

voidFunctionl(?,,);//全局函數(shù)聲明

???

classBox//類結(jié)構(gòu)聲明

{…

);

ttendif

示例1-2C++/C頭文件的結(jié)構(gòu)

xxx公司2

1.3定義文件的結(jié)構(gòu)

定義文件有二部分內(nèi)容:

(1)定義文件開頭處的版權(quán)和版本聲明(參見示例1T)。

(2)對(duì)一些頭文件的弓用。

(3)程序的實(shí)現(xiàn)體(包括數(shù)據(jù)和代碼)。

假設(shè)定義文件的名稱為graphics,cpp,定義文件的結(jié)構(gòu)參見示例1-3。

//版權(quán)和版本聲明見示例1-1,此處省略。

ffinclude“graphics.h”〃引用頭文件

//全局函數(shù)的實(shí)現(xiàn)體

voidFunctionl(??,)

//類成員函數(shù)的實(shí)現(xiàn)體

voidBox::Draw(…)

示例1-3C++/C定義文件的結(jié)構(gòu)

1.4頭文件的作用

早期的編程語(yǔ)言如Basic、Fortran沒有頭文件的概念,C++/C語(yǔ)言的初學(xué)

者雖然會(huì)用使用頭文件,但常常不明其理。這里對(duì)頭文件的作用略作解釋:

(1)通過頭文件來(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)頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方

式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕

程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。

1.5目錄結(jié)構(gòu)

如果一個(gè)軟件的頭文件數(shù)目比較多(如超過十個(gè)),通常應(yīng)將頭文件和定義

文件分別保存于不同的目錄,以便于維護(hù)。

XXX公司3

例如可將頭文件保存于include目錄,將定義文件保存于source目錄(可

以是多級(jí)目錄)。

如果某些頭文件是私有的,它不會(huì)被用戶的程序直接引月,則沒有必要公開

其“聲

明”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個(gè)

目錄。

2程序的版式

2.1版式

版式雖然不會(huì)影響程序的功能,但會(huì)影響可讀性。程序的版式追求清晰、美

觀,是可以把程序的版式比喻為“書法”。好的“書法”可讓人對(duì)程序一目了然,

看得興致勃勃。差的程序“書法”如螃蟹爬行,讓人看得索然無(wú)味,更令維護(hù)者

煩惱有加。請(qǐng)程序員們學(xué)習(xí)程序的“書法”,彌補(bǔ)大學(xué)計(jì)算機(jī)教育的漏洞,實(shí)在

很有必要??招衅鹬指舫绦蚨温涞淖饔???招械皿w(不過多也不過少)將使程

序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一

些紙張,但是值得。

【規(guī)則27-1]在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參

見示例

//空行//空行

voidFunctionl(??,)while(condition)

{(

statementl;

)//空行

//空行if(condition)

voidFunction2(??,)(

(statement2;

}

)else

//空行(

voidFunction3(…)statements;

{)

//空行

)statement4;

)

示例2T(a)函數(shù)之間的空行示例2T(b)函數(shù)內(nèi)部的空行

XXX公司4

2.2代碼行

【規(guī)則2-2-1】一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)

句。這樣的代碼容易閱讀,并且方便于寫注釋。

【規(guī)則2-2-2】if、for、while、do等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其

后。不論執(zhí)行語(yǔ)句有多少都要加{屋這樣可以防止書寫失誤。

intwidth;//寬度intwidth,height,depth;//寬

intheight;//高度度高度深度

intdepth;//深度

x=a+b;X=a+b;y=c+d;z=e+

y=c+d;f;

z=e+f;

if(width<height)if(width<height)

(dosomethingO;

dosomethingO;

}

for(initialization;for(initialization;

condition;update)condition;update)

(dosomethingO;

dosomethingO;other();

)

//空行

other();

示例2-2(a)風(fēng)格良好的代碼行示例2-2(b)風(fēng)格不良的代碼行

【建議2-2-1]盡可能在定義變量的同時(shí)初始化該變量(就近原則)

如果變量的引用處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如

果引用了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤。本建議可以減少隱患。例如

intwidth=10;//定義并初紿化width

intheight=10;//定義并初紿化height

intdepth=10;//定義并初紿化depth

xxx公司5

2.3代碼行內(nèi)的空格

【規(guī)則2-3-1】關(guān)鍵字之后要留空格。象const、virtualxinline^case等

關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。象if、for.while等關(guān)

鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)'(',以突出關(guān)鍵字。

【規(guī)則2-3-2】函數(shù)名之后不要留空格,緊跟左括號(hào)'(',以與關(guān)鍵字區(qū)

別。

【規(guī)則2-3-31'('向后緊跟,')'、','、';’向前緊跟,緊跟處

不留空格。

【規(guī)則2-3-41','之后要留空格,如Function(x,y,z)。如果‘;'不

是一行的結(jié)束符號(hào),其后要留空格,如for(initialization;condition;

update)o

【規(guī)則2-3-5]賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域

操作符,如“="、“十=”">="、“<二"、“十”、“水”、“%”、“&&”、

“||”、,…等二元操作符的前后應(yīng)當(dāng)加空格。

【規(guī)則2-3-61一元操作符如“!”、“?”、“++”、“一”、(地址

運(yùn)算符)等前后不加空格。

【規(guī)則2-3-7】象“口”、這類操作符前后不加空格。

【建議2-3-1】對(duì)于表達(dá)式比較長(zhǎng)的for語(yǔ)句和if語(yǔ)句,為了緊湊起見可以

適當(dāng)?shù)厝サ粢恍┛崭?,如for(i=0;i<10;i++)和if((a〈=b)&&(c<二d))

voidFund(intx,inty,intz);//良好的風(fēng)格

voidFund(intx,inty,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(1=0;IC10;i++)〃過多的空格

x=a<b?a:b;//良好的風(fēng)格

x=a<b?a:b;//不好的風(fēng)格

int*x=&y;//良好的風(fēng)格

int*x=&y;〃不良的風(fēng)格

array[5]=0;//不要寫成array[5]=0;

a.Function();//不要寫成a.Function();

xxx公司6

b->Function();//不要寫成b->Function();

示例2-3代碼行內(nèi)的空格

2.4對(duì)齊

【規(guī)則2-4-1】程序的分界符'{'和'}'應(yīng)獨(dú)占一行并且位于同一列,同

時(shí)與引用它們的語(yǔ)句左對(duì)齊。

【規(guī)則2-4-2]{}之內(nèi)的代碼塊在'{'右邊數(shù)格處左對(duì)齊。

voidFunction(intx)voidFunction(intx){

(???//programcode

…//programcode}

)

if(condition)if(condition){

(???//programcode

…//programcode)

)else{

else???//programcode

(}

…//programcode

)

for(initialization;condition;update)for(initialization;condition;update){

(…//programcode

???//programcode)

}

While(condition)while(condition){

(???//programcode

…//programcode}

)

如果出現(xiàn)嵌套的{},則使用縮進(jìn)對(duì)齊,如:

(

(

)

}

示例2-4(a)風(fēng)格良好的對(duì)齊示例2-4(b)風(fēng)格不良的對(duì)齊

2.5長(zhǎng)行拆分

【規(guī)則2-5-1】代碼行最大長(zhǎng)度宜控制在70至80個(gè)字符以內(nèi)。代碼行不要

過長(zhǎng),否則眼睛看不過來(lái),也不便于打印。

XXX公司7

【規(guī)則2-5-2]長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新

行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)

句可讀。

if((very_longer_variablel>=very_longer_variablel2)

&也(very_longer_variable3<=very_longer_variablel4)

&&(very_longer_variab1e5<=very_longer_variablel6))

(

dosomethingO;

}

virtualCMatrixCMultiplyMatrix(CMatrixleftMatrix,

CMatrixrightMatrix);

for(very_longer_initialization;

vary」onger_condition;

very_longer_update)

(

dosomethingO;

}

示例2-5長(zhǎng)行的拆分

2.6修飾符的位置

修飾符*和&應(yīng)該靠近數(shù)據(jù)類型還是該靠近變量名,是個(gè)有爭(zhēng)議的活題。

若將修飾符*靠近數(shù)據(jù)類型,例如:int*x;從語(yǔ)義上講此寫法比較直觀,

即x

是int類型的指針。上述寫法的弊端是容易引起誤解,例如:int*x,y;此

處y容易被誤解為指針變量。雖然將x和y分行定義可以避免誤解,但并不是人

人都愿意這樣做。

【規(guī)則2-6-1】應(yīng)當(dāng)將修乘符*和&緊靠變量名

例如:

char*name;

int*x,y;//此處y不會(huì)被誤解為指針

2.7注釋

C語(yǔ)言的注釋符為C++語(yǔ)言中,程序塊的注釋常采用"/*_*/”,

XXX公司8

行注釋一般采用。法釋通常用于:

(1)版本、版權(quán)聲明;

(2)函數(shù)接口說(shuō)明;

(3)重要的代碼行或段落提示。

雖然注釋有助于理解代碼,但注意不可過多地使用注釋C參見示例2-6。

【規(guī)則2-7-1]注釋是對(duì)代碼的“提示”,而不是文檔。程序中的注釋不可

喧賓奪主,注釋太多了會(huì)讓人眼花繚亂。注釋的花樣要少。

【規(guī)則2-7-2】如果代碼本來(lái)就是清楚的,則不必加注釋。否則多此一舉,

令人厭煩。例如

i++;//i加1,多余的注釋

【規(guī)則2-7-3】邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注

釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。

【規(guī)則2-7-41注釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性。錯(cuò)誤的注釋不但

無(wú)益反而有害。

【規(guī)則2-7-5]盡量避免在注釋中使用縮寫,特別是不常用縮寫。

【規(guī)則2-7-6]注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或

右方,不可放在下方。

【規(guī)則2-7-8】當(dāng)代碼比較長(zhǎng),特別是有多重嵌套時(shí),應(yīng)當(dāng)在一些段落的結(jié)

束處加注釋,便于閱讀。

/*if(...)

*函數(shù)介紹:(

*輸入?yún)?shù):???

*輸出參數(shù):while(...)

*返回值:(

*/

voidFunction(floatx,floaty,float)//endofwhile

z)???

{}//endofif

}

if(...)

(

while(...)

(

}//endofwhile

XXX公司9

2.8類的版式

類可以將數(shù)據(jù)和函數(shù)封裝在一起,其中函數(shù)表示了類的行為(或稱服務(wù))。

類提供關(guān)鍵字public、protected和private,分別用于聲明哪些數(shù)據(jù)和函數(shù)是

公有的、受保護(hù)的或者是私有的。這樣可以達(dá)到信息隱藏的目的,即讓類僅僅公

開必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。我們不可以濫用類的封裝功

能,不要把它當(dāng)成火鍋,什么東西都往里扔。

類的版式主要有兩種方式:

(1)將private類型的數(shù)據(jù)寫在前面,而將public類型的函數(shù)寫在后面,

如示例8-3(a)o采用這種版式的程序員主張類的設(shè)計(jì)“以數(shù)據(jù)為中心”,重點(diǎn)

關(guān)注類的內(nèi)部結(jié)構(gòu)。

(2)將public類型的函數(shù)寫在前面,而將private類型的數(shù)據(jù)寫在后面,

如示例8.3(b)采用這種版式的程序員主張類的設(shè)計(jì)“以行為為中心”,重點(diǎn)關(guān)

注的是類應(yīng)該提供什么樣的接口(或服務(wù)〉。很多C十十教課書受到Biariie

Stroustrup第一本著作的影響,不知不覺地采用了“以數(shù)據(jù)為中心”的書寫方

式,并不見得有多少道理。

建議讀者采用“以行為為中心”的書寫方式,即首先考慮類應(yīng)該提供什么樣

的函數(shù)。這是很多人的經(jīng)驗(yàn)一一“這樣做不僅讓自己在設(shè)計(jì)類時(shí)思路清晰,而且

方便別人閱讀。因?yàn)橛脩糇铌P(guān)心的是接口,誰(shuí)愿意先看到一堆私有數(shù)據(jù)成員!”

classAclassA

((

private:public:

inti,j;voidFund(void);

floatx,y;voidFunc2(void);

public:private:

voidFund(void);inti,j;

voidFunc2(void);floatx,y;

)}

示例8.3(a)以數(shù)據(jù)為中心版式示例8.3(b)以行為為中心的版式

3命名規(guī)則

比較著名的命名規(guī)則當(dāng)推Microsoft公司的“匈牙利”法,該命名規(guī)則的主

要思想是“在變量和函數(shù)名中加入前綴以增進(jìn)人們對(duì)程序的理解”。例如所有的

字符變量均以ch為前綴,若是指針變量則追加前綴p0如果一個(gè)變量由ppch開頭,

則表明它是指向字符指針的指針。“匈牙利”法最大的缺點(diǎn)是煩瑣,例如

inti,j,k;

XXX公司10

floatx,y,z;

倘若采用“匈牙利”命名規(guī)則,則應(yīng)當(dāng)寫成

intil,iJ,ik;//前綴i表示int類型

floatfX,fY,fZ;//前綴f表示float類型

如此煩瑣的程序會(huì)讓絕大多數(shù)程序員無(wú)法忍受。據(jù)考察,沒有一種命名規(guī)則

可以讓所有的程序員贊同,程序設(shè)計(jì)教科書一般都不指定命名規(guī)則。命名規(guī)則對(duì)

軟件產(chǎn)品而言并不是“成敗悠關(guān)”的事,我們不要化太多精力試圖發(fā)明世界上最

好的命名規(guī)則,而應(yīng)當(dāng)制定一種令大多數(shù)項(xiàng)目成員滿意的命名規(guī)則,并在項(xiàng)目中

貫徹實(shí)施。

3.1共性規(guī)則

本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當(dāng)在遵循這些共性規(guī)

則的前提下,再擴(kuò)充特定的規(guī)則,如3.2節(jié)。

【規(guī)則標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,不必進(jìn)行“解碼

標(biāo)識(shí)符最好采用英文單詞或其組合,便于記憶和閱讀。切忌使用漢語(yǔ)拼音來(lái)命名。

程序中的英文單詞一般不會(huì)太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確。例如不要把CurrentValue寫

成NowValue。

【規(guī)則標(biāo)識(shí)符的長(zhǎng)度應(yīng)當(dāng)符合"minTength&&max-information”

原則。幾十年前老ANSIC規(guī)定名字不準(zhǔn)超過6個(gè)字符,現(xiàn)今的C++/C不再有此

限制。一般來(lái)說(shuō),長(zhǎng)名字能更好地表達(dá)含義,所以函數(shù)名、變量名、類名長(zhǎng)達(dá)十

幾個(gè)字符不足為怪。那么名字是否越長(zhǎng)約好?不見得!例如變量名maxval就比

maxValueUnt"Overflow好用。單字符的名字也是有用的,常見的

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)識(shí)符通常采用“大小寫”混排的方式,如AddChild。

而Unix應(yīng)用程序的標(biāo)識(shí)符通常采用“小寫加下劃線”的方式,如add_child。別

把這兩類風(fēng)格混在一起用。

【規(guī)則3-1-4】程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符。

例如:

intx,X;//變量x與X容易混淆

voidfoo(intx);//函數(shù)foo與F00容易混淆

voidFOO(floatx);

【規(guī)則3-卜5】程序中不要出現(xiàn)標(biāo)識(shí)符完全相同的局部變量和全局變量,盡

管兩者的作用域不同而不會(huì)發(fā)生語(yǔ)法錯(cuò)誤,但會(huì)使人誤解。

【規(guī)則3-1-6]變量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞+名詞”。例如:

XXX公司11

floatvalue;

floatoldValue;

floatnewValue;

【規(guī)則3-1-7]全局函數(shù)的名字應(yīng)當(dāng)使用“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)

賓詞組)。類的成員函數(shù)應(yīng)當(dāng)只使用“動(dòng)詞”,被省略掉的名詞就是對(duì)象本身。

例如:

DrawBox();//全局函數(shù)

box->Draw();//類的成員函數(shù)

【規(guī)則3-1-8]用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函

數(shù)等。例如:

intminValue;

intmaxValue;

intSetValue(...);

intGetValue(...);

【建議3-1-1】盡量避免名字中出現(xiàn)數(shù)字編號(hào),如Valuel,Value2等,除非

邏輯上的確需要編號(hào)。這是為了防止程序員偷懶,不肯為命名動(dòng)腦筋而導(dǎo)致產(chǎn)生

無(wú)意義的名字(因?yàn)橛脭?shù)字編號(hào)最省事)。

3.2簡(jiǎn)單的Windows應(yīng)用程序命名規(guī)則

作者對(duì)“匈牙利”命名規(guī)則做了合理的簡(jiǎn)化,下述的命名規(guī)則簡(jiǎn)單易用,比

較適合于Windows應(yīng)用軟件的開發(fā)。

【規(guī)則3-2-1】類名和函數(shù)名用大寫字母開頭的單詞組合而成。例如:

classNode;//類名

classLeafNode;//類名

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

voidSetValue(intvalue);//函數(shù)名

【規(guī)則3-2-2]變量和參數(shù)用小寫字母開頭的單詞組合而成。例如:

BOOLflag;

intdrawMode;

【規(guī)則3-2-3】常量全用大寫的字母,用下劃線分割單詞。例如:

constintMAX=100;

constintMAX_LENGTH=100;

【規(guī)則3-2-4]靜態(tài)變量加前綴s_(表示static)。例如:

voidInit(...)

XXX公司12

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

}

【規(guī)則3-2-51如果不得三需要全局變量,則使全局變量加前綴g_(表示

global)。例如:

intg_howManyPeop1e;//全局變量

intg_howMuchMoney;//全局變量

【規(guī)則3-2-6】類的數(shù)據(jù)成員加前綴(表示member),這樣可以避免數(shù)據(jù)

成員與成員函數(shù)的參數(shù)同名。例如:

voidObject::SetValue(intwidth,intheight)

m_width=width;

mheight=height;

【規(guī)則3-2-7]為了防止某一軟件庫(kù)中的一些標(biāo)識(shí)符和其它軟件庫(kù)中的沖突,

可以為各種標(biāo)識(shí)符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所

有庫(kù)函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。

4表達(dá)式和基本語(yǔ)句

讀者可能懷疑:連if、for、while、goto、switch這樣簡(jiǎn)單的東西也要探

討編程風(fēng)格,是不是小題大做?

我真的發(fā)覺很多程序員生隱含錯(cuò)誤的方式寫表達(dá)式和基本語(yǔ)句,我自己也犯

過類似的錯(cuò)誤。表達(dá)式和語(yǔ)句都屬于C++/C的短語(yǔ)結(jié)構(gòu)語(yǔ)法。它們看似簡(jiǎn)單,但

使用時(shí)隱患比較多。本章歸納了正確使用表達(dá)式和語(yǔ)句的一些規(guī)則與建議。

4.1運(yùn)算符的優(yōu)先級(jí)

C++/C語(yǔ)言的運(yùn)算符有數(shù)十個(gè),運(yùn)算符的優(yōu)先級(jí)與結(jié)合律如表4-1所示。注

意一元運(yùn)算符+-*的優(yōu)先級(jí)高于對(duì)應(yīng)的二元運(yùn)算符。

XXX公司13

優(yōu)先級(jí)運(yùn)算符結(jié)合律

高()r1->.從左至右

!?++一(類型)從右至左

sizeof

+-*&

*/%從左至右

+-從左至右

??從左至右

<<=>>=從左至右

==1=從左至右

&從左至右

從左至右

1從左至右

&&從左至右

II從右至左

?:從右至左

低二+二一二*二/-%=&二從左至右

1=?=?=

表4-1運(yùn)算符的優(yōu)先級(jí)與結(jié)合律

【規(guī)則4-1-1】如果代碼行中的運(yùn)算符比較多,用括號(hào)確定表達(dá)式的操作順

序,避免使用默認(rèn)的優(yōu)先級(jí)。

由于將表4T熟記是比較困難的,為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用

括號(hào)確定表達(dá)式的操作順序。例如:

word=(high?8)|low

if((aIb)&&(a&c))

4.2復(fù)合表達(dá)式

如a二b二c二0這樣的表達(dá)式稱為復(fù)合表達(dá)式。允許復(fù)合表達(dá)式存在的理

由是:(1)書寫簡(jiǎn)潔;(2)可以提高編譯效率。但要防止濫用復(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;

xxx公司14

該表達(dá)式既求a值又求d值。應(yīng)該拆分為兩個(gè)獨(dú)立的語(yǔ)句:

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))

而是成了令人費(fèi)解的

if((a<b)<c)

4.3if語(yǔ)句

if語(yǔ)句是C++/C語(yǔ)言中最簡(jiǎn)單、最常用的語(yǔ)句,然而很多程序員用隱含錯(cuò)

誤的方式寫if語(yǔ)句。本節(jié)以“與零值比較”為例,展開討論。

4.3.1布爾變量與零值比較

【規(guī)則4-3-1]不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。

根據(jù)布爾類型的語(yǔ)義,零值為“假”(記為FALSE),任何非零值都是“真”

(記為TRUE)°TRUE的值究竟是什么并沒有統(tǒng)一的標(biāo)準(zhǔn)。例如VisualC++將TRUE

定義為1,而VisualBasic則將TRUE定義為-1。

假設(shè)布爾變量名字為flag,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:

if(flag)//表示flag為真

if(Iflag)//表示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語(yǔ)句如下:

if(value==0)

if(value!=0)

不可模仿布爾變量的風(fēng)格而寫成

if(value)//會(huì)讓人誤解value是布爾變量

XXX公司15

if(lvalue)

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

【規(guī)則4-3-3]不可將浮點(diǎn)變量用“二二”或“!二”與任何數(shù)字比較。

千萬(wàn)要留意,無(wú)論是float還是double類型的變量,都有精度限制。所以

一定要避免將浮點(diǎn)變量用或“!二”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>二”

或“<二”形式。

假設(shè)浮點(diǎn)變量的名字為x,應(yīng)當(dāng)將

if(x=0.0)//隱含錯(cuò)誤的比較轉(zhuǎn)化為

if((x>=-EPSIN0N)&&(x<=EPSIN0N))

其中EPSIN0N是允許的誤差(即精度)。

4.3.4指針變量與零值比較

【規(guī)則4-3-4】應(yīng)當(dāng)將指針變量用“一”或與NULL比較。

指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但是兩

者意義不同。假設(shè)指針變量的名字為p,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:

if(P二二NULL)//p與NULL顯式比較,強(qiáng)調(diào)p是指針變量

if(p!=NULL)

不要寫成

if(p==0)//容易讓人誤解p是整型變量

if(p!=0)

或者

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

if(Jp)

4.3.5對(duì)if語(yǔ)句的補(bǔ)充說(shuō)明

有時(shí)候我們可能會(huì)看到if(NULL=p)這樣古怪的格式,不是程序?qū)戝e(cuò)了,

是程序員為了防止將if(p==NULL)誤寫成if(p=NULL),而有意把p和NULL

顛倒。編譯器認(rèn)為if(p二NULL)是合法的,但是會(huì)指出if(NULL二p)是錯(cuò)誤

的,因?yàn)镹ULL不能被賦值。程序中有時(shí)會(huì)遇到if/else/return的組合,應(yīng)該將

如下不良風(fēng)格的程序

if(condition)

returnx;

returny;

改寫為

if(condition)

XXX公司16

returnx;

}

else

(

returny;

}

或者改寫成更加簡(jiǎn)練的

return(condition?x:y);

4.4循環(huán)語(yǔ)句的效率

C++/C循環(huán)語(yǔ)句中,for語(yǔ)句使用頻率最高,while語(yǔ)句其次,do語(yǔ)句很

少用。本節(jié)重點(diǎn)論述循環(huán)體的效率。提高循環(huán)體效率的基本辦法是降低循環(huán)體的

復(fù)雜性。

【建議4-4-1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,

最短的

循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。例如示例4-4(b)的效率比

示例

4-4(a)的高。

for(row=0;row<100;row++)for(col=0;col<5;col++)

((

for(col=0;col<5;col++)for(row=0;row<100;row++)

{|

sum=sum+a[row][col];sum=sum+a[row][col];

)}

))

示例4-4(a)低效率:長(zhǎng)循環(huán)在最外層示例4-4(b)高效率:長(zhǎng)循環(huán)在最內(nèi)

【建議4-4-2】如果循環(huán)為內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯

判斷移到循環(huán)體的外面。示例4-4(c)的程序比示例4-4(d)多執(zhí)行了NT次邏輯判

斷。并且由于前者老要進(jìn)行邏輯判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器

不能對(duì)循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果N非常大,最好采用示例4-4(d)

的寫法,可以提高效率。如果N非常小,兩者效率差別并不明顯,采用示例4-4(c)

的寫法比較好,因?yàn)槌绦蚋雍?jiǎn)潔。

XXX公司

for(i=0;i<N;i++)if(condition)

((

if(condition)for(i=0;i<N;i++)

DoSomethingO;DoSomethingO;

else}

DoOtherthingO;else

)(

for(i=0;i<N;i++)

DoOtherthingO;

)

表4-4(c)效率低但程序簡(jiǎn)潔表4-4(d)效率高但程序不

簡(jiǎn)潔

4.5fox-語(yǔ)句的循環(huán)控制變量

【規(guī)則4-5-1]不可在for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。

【建議4-5-1]建議for語(yǔ)句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”

寫法。示例4-56)中的x值屬于半開半閉區(qū)間"0=<x<N",起點(diǎn)到終點(diǎn)的間

隔為N,循環(huán)次數(shù)為N。示例4-5(b)中的x值屬于閉區(qū)間"0=<x<=NT",起

點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。

相比之下,示例4-5(a)的寫法更加直觀,盡管兩者的功能是相同的。

for(intx=0;x<N;x++)for(intx=0;x<=N-l;x++)

((

))

示例4-5(a)循環(huán)變量屬于半開半閉區(qū)間示例4-5(b)循環(huán)變量屬于閉區(qū)

4.6switch語(yǔ)句

有了if語(yǔ)句為什么還要switch語(yǔ)句?

switch是多分支選擇語(yǔ)句,而if語(yǔ)句只有兩個(gè)分支可供選擇。雖然可以用

嵌套的if語(yǔ)句來(lái)實(shí)現(xiàn)多分支選擇,但那樣的程序冗長(zhǎng)難讀。這是switch語(yǔ)句存

在的理由。

switch語(yǔ)句的基本格式是:

switch(variable)

XXX公司

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論