《高質量C C程式設計指南》糾錯與拾遺 一

2021-04-13 00:32:32 字數 3329 閱讀 6013

使用

c++/c

程式設計的程式設計師,幾乎都看過林銳博士寫的《高質量

c++c

程式設計指南》這篇百頁經書,並且通過閱讀這篇百頁經書,受益匪淺。我也是這篇文章的受益者。通過這篇百頁經書,我學到很多知識,也給於了我深入學習

c++的動力。

最近,偶得機會,再次拜讀林銳博士的《高質量

c++c

c++c

c++c

程式設計指南》的一些觀點,如果這些觀點能夠對讀者學習

c++起到的啟迪作用,作者就萬分歡喜了,

2:見證作者的

c++

c++c

c++c

程式設計指南》中點到為止的技術,觀點,做一些簡短的補充和解釋。

林銳博士的《高質量

c++c

程式設計指南》是一本很好的程式設計規範手冊,在具體專案中,具體環境中這些規範並不一定是最好的,但是已經足夠好,所以我不想找這些規範的錯誤,不想對這些規範作更多的解釋。本文的重點將放在對技術的討論上,此乃一家之言,切勿較真。

1:盡量使用小寫的

bool型別

關於bool

型別的if

判斷在林銳博士的《高質量

c++c

程式設計指南》的

4.3.1

布林變數與零值比較

如下說明

【規則

4-3-1不可將

布林變數直接與

true

、false或者1

、0進行比較。

根據布林型別的語義,零值為「假」(記為

false

),任何非零值都是「真」(記為

true

)。true

的值究竟是什麼並沒有統一的標準。例如

visual c++

將true

定義為1

,而visual basic

則將true

定義為-1。

假設布林變數名字為flag,它與零值比較

的標準if

語句如下:

if (flag)//

表示flag為真

if (!flag)//

表示flag為假

其它的用法都屬於不良風格,例如:

if (flag == true)

if (flag == 1 )

if (flag == false) 

在這裡首先說明的一點是,在標準

c/c++

中沒有內建大寫的

bool

,true

,false

關鍵字,這些關鍵字是

vc的擴充套件,在

windef.h

檔案中我們找到如下的宣告

typedef intbool;

#ifndef false

#define false0

#endif

#ifndef true

#define true1

#endif

可見在vc下

bool

型別是int

型的巨集,而

true

,false

分別代表0,

1。通過下面的例子更能說明問題

cout << "sizeof(bool): "《值為

4cout << "sizeof(true): "《值為

4cout << "sizeof(false): "《值為4

林銳博士博士在文章中提到「

true

的值究竟是什麼並沒有統一的標準,

visual c++

將true

定義為1

,而visual basic

則將true

定義為-1

」其實我認為在此舉例並不能很好說明問題,因為

visual basic

是並沒有採用

c/c++

程式語言,所以無法例證

true

的宣告。當把

bool

定義為int

,true

定義為1

,false

定義為0

時,會引發諸多問題,比較典型的集中情況如下 1

:不會存在如下型別的函式過載

void fun(bool);

void fun(int);

此時bool

是int

型,編譯器並不認為上面兩個函式是過載,而認為是重複定義。

2:當定義

void fun(int)

函式時,

出現以下情況編譯器都將按

int型處理

int i = 5;

int j = 3;

bool bstate = false;

fun(i 3

:++,--

問題 這種問題更為隱秘,當我們定義

bool state(true);

如果程式**很長,並且複雜,那麼我們無意中執行了

—state

操作,編譯器不會提示任何錯誤,並且我們的

if判斷也不會出現任何判斷問題。這條隱藏的

bug將是非常難找的。 標準

c/c++

的中內建的關鍵字是小寫的

bool,true,false

,如果我們採用

bool

型別可以很好避免如上提到的問題。所以,在平時程式設計時盡量使用

bool

型別而不是

bool

型別。

有的平台上是如下定義

bool

型別的enum bool ;

採用這種方法,解決問題並不徹底。讀者可以根據上面例子,判斷這種方式的優缺點。 關於

bool

型別在if

語句中的判斷,如果我們在編寫乙個跨平台,並且不想受

c++語言的發展對程式**的影響,在

if判斷時最好採用

if (flag == false)

if (flag == true)

方式。因為c++沒有規定true的值為什麼,同樣也就沒有規定false的值為什麼,只是編譯器一般的做法是把false定義為0(這裡的0並不是int中的0,它可能是二進位制0,也可以能是乙個位元組中的0),而把非false的值,定義為true,如果將來c++明確規定false為1,ture為2,那麼按照原來的寫法,所有的if語句都要修改,這種說法可能有些杞人憂天,至少說明,將來可能會出現這種情況。所以最好採用

if (flag == false)

if (flag == true)

這種方式。

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...

高質量C C程式設計指南

目錄 前 言.6 第1章檔案結構 11 1.1 版權和版本的宣告 11 1.2 標頭檔案的結構 12 1.3 定義檔案的結構 13 1.4 標頭檔案的作用 13 1.5 目錄結構 14 第2章程式的版式 15 2.1 空行.15 2.2 行.16 2.3 行內的空格 17 2.4 對齊.18 2.5...

高質量C C程式設計指南 5

第5章常量 常量是一種識別符號,它的值在執行期間恆定不變。c語言用 define來定義 常量 稱 為巨集常量 c 語言除了 define外還可以用 const來定義 常量 稱 為const 常量 5.1為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程式的可 讀性 可...