第
1
章
檔案結構
標頭檔案的作 用
早期的程式語言如
basic
、fortran
沒有標頭檔案的概念,
c++/c
語言的初學者雖然會用使用標頭檔案,但常常不明其理。這裡對頭檔案的作用略作解釋: (
1)通過標頭檔案來呼叫庫功能。在很多場合,源 **不便(或不准)向使用者公布,只要向使用者提供標頭檔案和二進位制的庫即可。使用者只需要按照標頭檔案中的介面宣告來呼叫庫功能,而不必關心介面怎麼實現的。編譯 器會從庫中提取相應的**。 (
2)標頭檔案能加強型別安全檢查。如果某個介面 被實現或被使用時,其方式與標頭檔案中的宣告不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程式設計師除錯、改錯的負擔。
第
2章
程式的版式
空行起著分隔程式段落的作用。空行得體(不過多也不過少)將使程式的布局更加清晰。空行不會浪費內 存,雖然列印含有空行的程式是會多消耗一些紙張,但是值得。所以不要舍不空行。
修飾符的位置
若將 型別的 指標。
此處y 容 易被誤解為指標變數。
雖然將x和
y分行定義可以避免誤解,但並不是人人都願意這樣做。
【規 則
2-6-1】
應當將修飾符 和&
緊靠變數名
例如:char *name;
此處y 不會被誤解為指標
比較著名的
命名規則當推
microsoft
公司的「匈牙利」法,該 命名規則的主要思想是「
在變數和函式名中加入字首以增進人們對程式的理 解」。例如所有的字元變數均以ch 為字首,若是指標變數則追加字首p 。如果乙個變數由ppch 開頭,則表明它是指向字元指 針的指標。「匈牙利」法最大的缺點是煩瑣。
【規則3-1-3】命 名規則盡量與所採用的作業系統或開發工具的風格保持一致。
【規則
3-1-6】變數的名字應當使用「名詞」或者「形容詞+名詞」。
例如:float value;
float oldvalue;
float newvalue;
【規則 3-1-7】全域性函式的名字應當使用「動詞」或者「動詞+名詞」(動賓片語)。類的成員函式應當只使用「動詞」, 被省略掉的名詞就是物件本身。
例如:全域性函式
類的成員函式
【規則 3-1-8】用正確的反義詞組命名具有互斥意義的變數或相反動作的函式等。
例如:int minvalue;
int maxvalue;
int setvalue(…);
int getvalue(…);
簡單的windows
應用程式命名規則 例如
windows
應用程式的識別符號通常採用「大小寫」混排的方式,如
addchild
。而unix
應用程式的識別符號通常採用「小寫加 下劃線」的方式,如
add_child
。別把這兩類風格混在一起用。
簡單的windows
應用程式命名規則
【規則 3-2-4】靜態變數加字首
s_(表示
static)。
例如:void init(…)
【規則 3-2-5】如果不得已需要全域性變數,則使全域性變數加字首
g_(表示
global)。
例如:
全域性變數
全域性變數
【規則 3-2-6】類的資料成員加字首
m_(表示
member
),這樣可以避免 資料成員與成員函式的引數同名。
例如:void object::setvalue(int width, int height)
第
4
章
表示式和基本語句
4.3.2
整型變數與零值比較
【規則
4-3-2】應當將
整型變數用「== 」 或「!= 」直接與0 比較。
假設整型變數的名 字為value ,它與零值比較
的標準if
語句如下:
if (value == 0)
if (value != 0)
不可模仿布林變數的風格而寫成
value 是布林變數
if (!value)
4.3.3
浮點變數與零值比較
【規則
4-3-3】不可將
浮點變數用「== 」或「!= 」與任何數字比較。
千萬要留意,無論是float 還是double 型別的變數,都有精度限制。所以一定要避免將浮點變數用「== 」 或「!= 」與數字比較,應該設法轉化成「>= 」 或「<= 」形式。
假設應當將
隱含 錯誤的比較
轉化為if ((x>=-epsinon) && (x<=epsinon))
其中epsinon 是允許的誤差(即精度)。
4.3.5
對if 語句的補充說明
if (null = p) 是錯誤的,因為null 不能被賦值。
程式中有時會遇到if/else/return 的組合,應該將如下不良風格的程式
if (condition)
return x;
return y;
改寫為if (condition)
else
或者改寫成更加簡練的
return (condition ? x : y);
迴圈語句的效率
c++/c迴圈語句中,for 語句使用頻率最高,while 語句其次,do 語句很少用。本節重點論述循 環體的效率。提高迴圈體效率的基本辦法是降低迴圈體的複雜性。
【建議
4-4-2】如果迴圈體內存在邏輯判斷,並且迴圈次數很大,宜將邏輯判斷移到迴圈體的外面。示例4-4(c) 的 程式比示例4-4(d) 多執行了n-1 次邏 輯判斷。並且由於前者老要進行邏輯判斷,打斷了迴圈「流水線」作業,使得編譯器不能對迴圈進行優化處理,降低了效率。如果n 非常大,最好採用示例4-4(d) 的寫法,可以提高效 率。如果n 非常小,兩者效率差別並不明顯,採用示例4-4(c) 的 寫法比較好,因為程式更加簡潔。
for (i=0; i
if (condition)
else
效率高但程式不簡潔
【建議
4-4-1】在多重迴圈中,如果有可能,應當將最長的 迴圈放在最內層,最短的迴圈放在最外層,以減少cpu 跨切迴圈層的次數。例如示例4-4(b) 的效率比示例4-4(a) 的高。
for (row=0; row<100; row++)
} for (col=0; col<5; col++ )
} 高效率:長迴圈在最內層
自從提倡結構化設計以來,goto 就成了有爭 議的語句。首先,由於goto 語句可以靈活跳轉,如果不加限制,它的確會破壞結構化設計風格。其 次,goto 語句經常帶來錯誤或隱患。它可能跳過了某些物件的構造、變數的初始化、重要的計算等語 句,例如:
goto state;
被goto 跳
被goto 跳 過 …
state: …
如果編譯器不能發覺此類錯誤,每用一次goto 語句都可能留下隱 患。
例如
} }
error: …
就象樓房著火了,來不及從 樓梯一級一級往下走,可從視窗跳出火坑。所以我們主張少用、慎用goto 語句,而不是禁用。
《高質量C 程式設計指南》筆記
高質量 c 程式設計指南 是一本關於c 程式設計風格的指導 建議性的書,誕生已經有一年多了,初學c 閱讀此書,感覺甚好,收穫很大。這本書對初學者掌握好的編碼習慣有極大的幫助,對老手改進編碼方式也有好處。xml namespace prefix o ns urn schemas microsoft c...
《高質量程式設計指南》C 題目
今天晚上下了本 高質量程式設計指南 據說那幾個題目 20個碩士裡面,得50分以上的還沒有超過一半。如果能得滿分,林銳博士拜你為師。我就很感興趣的去做了一下,發現都很基本。我這個半路出家的人,居然也能做個80分。給了自己很大的信心,同時,也覺得很多問題,還是平時很愛犯的錯誤。今天把我的錯誤貼出來和大家...
高質量C C程式設計指南
1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...