函數(shù)名: assert
頭文件:<assert.h>
函數(shù)原型: void assert( int expression );
功能: 斷言一個(gè)表達(dá)式是否正確
參數(shù):expression如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,然后通過調(diào)用 abort 來終止程序運(yùn)行
返回值:沒有返回值
補(bǔ)充:
1、頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開銷。在調(diào)試結(jié)束后,可以通過在包含#include <assert.h>的語句之前插入 #define NDEBUG 來禁用assert調(diào)用。
2、在函數(shù)開始處檢驗(yàn)傳入?yún)?shù)的合法性。
3、每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無法直觀的判斷是哪個(gè)條件失敗。
4、不能使用改變環(huán)境的語句,因?yàn)閍ssert只在DEBUG個(gè)生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)忽略了assert語句就會(huì)遇到問題,如:
錯(cuò)誤:
assert(i++ < 100);
這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語句就不會(huì)執(zhí)行,那么i++這條命令就沒有執(zhí)行。
正確:
assert(i < 100); i++;
5、assert和后面的語句應(yīng)空一行,以形成邏輯和視覺上的一致感。
6、有的地方,assert不能代替條件過濾。 assert是用來避免顯而易見的錯(cuò)誤的,而不是處理異常的。錯(cuò)誤和異常是不一樣的,錯(cuò)誤是不應(yīng)該出現(xiàn)的,異常是不可避免的。c語言異??梢酝ㄟ^條件判斷來處理,其它語言有各自的異常處理機(jī)制。一個(gè)非常簡單的使用assert的規(guī)律就是,在方法或者函數(shù)的最開始使用,如果在方法的中間使用則需要慎重考慮是否是應(yīng)該的。方法的最開始還沒開始一個(gè)功能過程,在一個(gè)功能過程執(zhí)行中出現(xiàn)的問題幾乎都是異常。
程序例: 斷言變量a<80,并將結(jié)果輸出
#include<assert.h> #include<stdio.h> int main(void){ int a=50; assert(a<80); //斷言a<80,如果為0輸出錯(cuò)誤信息終止程序,否則繼續(xù)執(zhí)行 printf("Assert a is true\n"); return(0); }
運(yùn)行結(jié)果:
Assert a is true
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程