
代碼就是程序員的面子,無論是在工作中在電腦上寫程序代碼還是在面試時在紙上寫演示代碼我們都希望寫出整潔,優雅的代碼。特別在工作中當我們碰到需要維護別人的代碼,或者是多人參與一個項目大家一起寫代碼的時候,如果碰到一些丑陋的代碼,我們還要看懂并且修改它的時候,那種難受,肯定會讓我們回想起多年以前自己還是新手程序員的時候,寫下的那些丑陋的代碼,并且深深內疚于將它們留給了我們的后繼者,不知道他們和它們是否還安好。所以,強調代碼的規范性,寫出整潔,優雅,可讀性高的代碼應該是成為一個合格的程序員的第一步。這里我就拋磚引玉,給大家一些關于C++代碼規范性的一些建議。
一、關于添加空格和空行的一些建議
寫代碼的時候添加良好風格的空格和空行可以使代碼看上去更整潔,布局更清晰。
1.空格
· 建議一:函數名之后不要留空格,緊跟左括號‘ (’,以與關鍵字區別。
· 建議二:象 if、 for、 **while **等關鍵字之后應留一個空格再跟左括號‘ (’,以突出關鍵字。
· 建議三:‘,’之后要留空格。在for語句中的‘;’其后要留空格,如 for (i=0; i<5; i++)。
· 建議四:對于表達式比較長的 **for **語句和 **if **語句,為了緊湊起見可以適當地去掉一些空格。
· 建議五:賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,如“ =”、“ +=” “>=”、“ <=”、“ +”、“ *”、“ %”、“ &&”、“ <
- 建議六:一元操作符如“ !”、“ ~”、“ ++”、“ --”、“ &”(地址運算符)等前后不加空格。
下面這段代碼就會顯得不優雅,看著有些別扭。
//不好的風格void func (int a,int b,int c,int d){ if(a>=0) { if(a>=b&&c>=d) { int * x = & a; ...//doSomeThing(); } }}
我們希望將它改為這樣。
//良好的風格void func(int a, int b, int c, int d)//建議一,建議三{ if (a >= 0)//建議二,建議五 { if ((a>=b) && (c>=d))//建議四 { int *x = &a; //建議六 ...//doSomeThing(); } }}
還有這樣的for語句for (i = 0; i < 5; i ++),就屬于空格濫用了,應該改為for (i=0; i<5; i++)。
2.空行
- 建議一:在實現函數時,函數與函數之間應加空行。
- 建議二:在一個函數體內,邏揖上密切相關的語句之間不加空行,其它地方應加空行。
當程序中沒有空行時是這樣的。
void func1(){ while (condition) { ...//doSomeThing(); if (condition) { ...//doSomeThingRelated(); } else { ...//doSomeThingRelated(); } ...//doSomeThing(); }}void func2(){ ...//doSomeThing();}
而良好的空行不緊能使代碼看上去更整潔,代碼邏輯也會更清晰。
//良好的風格void func1(){ while (condition) { ...//doSomeThing(); if (condition) { ...//doSomeThingRelated(); } else { ...//doSomeThingRelated(); } ...//doSomeThing(); }}void func2(){ ...//doSomeThing();}
二、關于代碼行格式的一些建議
· 建議一:一行代碼只做一件事情。
· 建議二:長表達式要在低優先級操作符處拆分成新行,操作符放在新行之首 (以便突出操作符)。拆分出的新行要進行適當的縮進,使排版整齊,語句可讀。
//不好的風格void func(){ int veryVeryLongWidth, veryVeryLongHeight; if ((veryVeryLongWidth > veryVeryLongHeight) || (veryVeryLongWidth < veryVeryLongHeight))doSomeThing();}
過長的代碼行無論是書寫還是閱讀對人來說都不是一個美好的體驗,所以我們建議以上代碼要這樣寫。
//良好的風格void func(){ int veryVeryLongWidth; int veryVeryLongHeight; if ((veryVeryLongWidth > veryVeryLongHeight) || (veryVeryLongWidth < veryVeryLongHeight)) { doSomeThing(); }}

三、關于命名的一些建議
· 建議一:變量,函數,文件命名應該具有描述性,最好采用英文單詞或其組合(不要使用拼音,或者無意義的abc之類的,除了像for (i=0; i<5; i++)中的i這樣的),以便記憶和閱讀。
· 建議二:類名和函數名用大寫字母開頭的單詞組合而成。
例如:
class Book; class ReadBook; void Draw(); void DrawImage();
· 建議三:變量和參數用小寫字母開頭的單詞組合而成。
例如:
int value;void SetValueMode(int valueMode);
· 建議四:常量全用大寫的字母,用下劃線分割單詞。
例如:
const int MAX = 100;const int MAX_LENGTH = 100;
· 建議五:全局變量加前綴 g_(表示 global)。靜態變量加前綴 s_(表示 static)。類的成員變量加前綴 m_(表示 member)。
例如:
int g_maxValue;static int s_maxValue; void Object::SetValue(int maxValue){ m_maxValue = maxValue;}
四、關于添加注釋的一些建議
在C++中注釋主要有兩種,程序塊的注釋常采用“ /*…*/”,行注釋一般采用“ //…”。注釋主要用在3個地方。1、版權申明,2、函數說明,3、重要或復雜代碼提示。對于前兩種,每個人或者每個公司都有個人的規范和習慣,這里只要大家在公司內部統一即可。關于第三種給重要或復雜代碼添加提示,我們有一下幾點建議。
· 建議一:注釋的確很重要,但是最好的代碼本身就是文檔(self-document),類型和變量命名意義明確要比通過注釋解釋模糊命名好得多。
· 建議二:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要記得刪除。
· 建議三:注釋的位置應與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方。
五、關于類中成員聲明次序的一些建議
- 建議一:在類中按照public:、protect:、private:的次序聲明。如果那一塊沒有直接忽略。
- 建議二:在同一塊中按照1、結構體和枚舉,2、常量,3、構造函數,4、析構函數,5、成員函數,6、成員變量的次序聲明。
六、關于if語句中的變量“與零值比較”的一些建議
- 建議一:不可將布爾變量直接與 TRUE、 **FALSE **或者 1、 **0 **進行比較。
假設布爾變量名字為 flag,它與零值比較的標準 if 語句如下:
if (flag) // 表示 flag 為真if (!flag) // 表示 flag 為假
- 建議二:應當將整型變量用“ ==”或“!=”直接與 0 比較。
- 假設整型變量的名字為 value,它與零值比較的標準 if 語句如下:
if (value == 0)if (value != 0)
也可以將0放在比較運算符前面。
if (0 == value)if (0 != value)
這時如果將“==”寫成“=”,編譯器會報錯。
· 建議三:不可將浮點變量用“ ==”或“!=”與任何數字比較。無論是 float 還是 double 類型的變量,都有精度限制。所以一定要避免將浮點變量用“ ==”或“!=”與數字比較,應該設法轉化成“ >=”或“ <=”形式。
假設浮點變量的名字為 x,應當將
if (x == 0.0) // 隱含錯誤的比較
修改為
const float EPSINON = 0.00001;if ((x>=-EPSINON) && (x<=EPSINON))
其中 EPSINON 是允許的誤差(即精度)。
· 建議四:應當將指針變量用“ ==”或“! =”與** NULL **比較。
假設指針變量的名字為 p,它與零值比較的標準 if 語句如下:
if (p == NULL) // p 與 NULL 顯式比較,強調 p 是指針變量if (p != NULL)

有什么好的想法,歡迎評論。 喜歡的關注收藏哦!