高質量C 程式設計 第6章 函式設計 2

2021-06-06 22:48:04 字數 1670 閱讀 4779

在函式 或 ** 前後 判斷引數 或 變數的合法性

方法:使用斷言 assert

作用:用來檢查一些必須符合的條件,捕捉 "不應該" 發生的非法情況,如果不符合條件,則不讓程式繼續執行下去。

使用時間 &  位置:

前置條件斷言:**執行之前 或 在函式的入口處,使用斷言檢查 引數 的合法性。

斷言執行:表示呼叫者出錯了

後置條件斷言:**執行之後 或 在函式的出口處,使用斷言檢查 引數 是否正確執行

斷言執行:表示**執行完後,引數的值 出現了 不可能出現的值 

前後不變斷言:**執行前後 或 在函式的入出口處,使用斷言檢查引數是否發生變化

斷言執行:表示 執行某些**後,變數值被修改了

怎麼使用:

在編寫函式時,要進行反覆的考查,並且自問:「我打算做哪些假定?(引數在哪種情況下是有意義的)」 一旦確定了的假定,就要使用斷言對假定進行檢查。

什麼時候使用斷言:

1.可以在正常情況下 程式不會到達的地方放置斷言

2.斷言可以用於 檢查傳遞給私有方法的引數。(對於公有方法,因為是提供給外部的介面,所以必須在方法中有相應的引數檢驗才能保證**的健壯性)

3.使用斷言測試方法執行的前置條件和後置條件 4.

使用斷言檢查類的不變狀態,確保任何情況下,某個變數的狀態必須滿足。(如age屬性應大於0小於某個合適值)

什麼地方不要使用斷言:

1.不要使用斷言作為公共方法的引數檢查,公共方法的引數永遠都要執行

2.斷言語句不可以有任何邊界效應,不要使用斷言語句去修改變數和改變方法的返回值.

錯誤用法:

assert(i++ < 100)

原因:i++只能在debug下執行,release下不會執行,這就導致在兩種環境下執行結果不同

正確用法:

assert(i < 100)

i++;

語法:

assert(表示式);

表示式的值 表示 正確的情況

即,"我斷言,***是真地"

使用這個巨集前需要包含標頭檔案assert.h

如果表示式的值為假,整個程式將退出,並輸出一條錯誤資訊

如果表示式的值為真,則繼續執行後面的語句

注意事項:

1、使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。

因此,在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用assert呼叫

2、每個assert語句只檢驗乙個條件。因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗

不推薦使用

assert(noffset>=0 && noffset+nsize<=m_ninfomationsize);

推薦使用

assert(noffset >= 0);

assert(noffset+nsize <= m_ninfomationsize);

高質量C 程式設計 第6章 函式設計 1

6.1 引數的規則 規則6 1 1 引數的書寫要完整,如果函式沒有引數,則用void 填充 void setvalue int width,int height 良好的風格 float getvalue void 良好的風格 void setvalue int,int 不良的風格 float get...

高質量C 程式設計 第6章 函式設計 3

在函式體的 出口處 對return語句的正確性和效率進行檢查 注意事項如下 1 return 語句不可返回指向 棧記憶體 的 指標 或者 引用 即函式的區域性變數 因為該內存在函式體結束時被自動銷毀 char func void 3 如果函式返回值是乙個物件,要考慮return 語句的效率。retu...

高質量程式設計指南 第1章

規則1 2 1 為了防止標頭檔案被重複引用,應當用ifndef define endif結構產生預處理塊。一 為什麼會出現標頭檔案被重複引用的問題 在乙個cpp檔案中,可以包含多個標頭檔案,而標頭檔案間又是可以相互引用的,這就導致乙個cpp檔案中可能間接多次包含某個標頭檔案,如果標頭檔案中 沒有防止...