在函式 或 ** 前後 判斷引數 或 變數的合法性
方法:使用斷言 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檔案中可能間接多次包含某個標頭檔案,如果標頭檔案中 沒有防止...