日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言断言

發(fā)布時(shí)間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言断言 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.概述

?? ? ?斷言是對某種假設(shè)條件進(jìn)行檢查(可理解為若條件成立則無動(dòng)作,否則應(yīng)報(bào)告),它可以快速發(fā)現(xiàn)并定位軟件問題,同時(shí)對系統(tǒng)錯(cuò)誤進(jìn)行自動(dòng)報(bào)警。斷言可以對在系統(tǒng)中隱藏很深,用其它手段極難發(fā)現(xiàn)的問題進(jìn)行定位,從而縮短軟件問題定位時(shí)間,提高系統(tǒng)的可測性。實(shí)際應(yīng)用時(shí),可根據(jù)具體情況靈活地設(shè)計(jì)斷言。

2.標(biāo)準(zhǔn)斷言機(jī)制

?

???原型定義
#include <assert.h>
void assert( int expression_r_r_r );

?? assert的作用是現(xiàn)計(jì)算表達(dá)式 expression_r_r_r ,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,然后通過調(diào)用 abort來終止程序運(yùn)行。

3.實(shí)戰(zhàn)演練

?? 請看下面的程序

#include <stdio.h> #include <assert.h> #include <stdlib.h> int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" );//以可寫的方式打開一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件 assert( fp ); //所以這里不會(huì)出錯(cuò) fclose( fp ); fp = fopen( "noexitfile.txt", "r" );//以只讀的方式打開一個(gè)文件,如果不存在就打開失敗 assert( fp ); //所以這里出錯(cuò) fclose( fp ); //程序永遠(yuǎn)都執(zhí)行不到這里來 return 0; }

  

4.小結(jié)

?

1)在函數(shù)開始處檢驗(yàn)傳入?yún)?shù)的合法性
如:

int resetBufferSize(int nNewSize)
{
??//功能:改變緩沖區(qū)大小,
??//參數(shù):nNewSize 緩沖區(qū)新長度
??//返回值:緩沖區(qū)當(dāng)前長度
??//說明:保持原信息內(nèi)容不變?????nNewSize<=0表示清除緩沖區(qū)
??assert(nNewSize >= 0);
??assert(nNewSize <= MAX_BUFFER_SIZE);

??...
}

2)每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無法直觀的判斷是哪個(gè)條件失敗

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好: assert(nOffset >= 0);
?? ?assert(nOffset+nSize <= m_nInfomationSize);


3)不能使用改變環(huán)境的語句,因?yàn)閍ssert只在DEBUG個(gè)生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)遇到問題
錯(cuò)誤: assert(i++ < 100)
這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語句就不會(huì)執(zhí)行,那么i++這條命令就沒有執(zhí)行。
正確: assert(i < 100)
?????i++;
4)assert和后面的語句應(yīng)空一行,以形成邏輯和視覺上的一致感

5)有的地方,assert不能代替條件過濾

6)注意事項(xiàng):??? ?

?? ①使用assert的缺點(diǎn)是,頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開銷。

?? ? 在調(diào)試結(jié)束后,可以通過在包含#include <assert.h>的語句之前插入 #define NDEBUG 來禁用assert調(diào)用,示例代碼如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>

???②ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略掉。(在C中,ASSERT是宏而不是函數(shù)),使用ASSERT“斷言”容易在debug時(shí)輸出程序錯(cuò)誤所在。
???而assert()的功能類似,它是ANSI C標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個(gè)重要區(qū)別是可以用在Release版本中。

?? 參考文章推薦:華為軟件編程規(guī)范

轉(zhuǎn)載于:https://www.cnblogs.com/skl374199080/p/3502062.html

總結(jié)

以上是生活随笔為你收集整理的C语言断言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。