亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Assert(斷言實現機制深入剖析)

2020-01-26 15:53:00
字體:
來源:轉載
供稿:網友

斷言(assert)的作用是用來判斷程序運行的正確性,確保程序運行的行為與我們理解的一致。其調用形式為assert(logic expression),如果邏輯表達式為假,則調用abort()終止程序的運行。

查看MSDN幫助文檔,可以得到assert的解釋信息如下:

復制代碼 代碼如下:

The ANSI assert macro is typically used to identify logic errors during program development, by implementing the expression argument to evaluate to false only when the program is operating incorrectly. After debugging is complete, assertion checking can be turned off without modifying the source file by defining the identifier NDEBUG. NDEBUG can be defined with a /D command-line option or with a #define directive. If NDEBUG is defined with #define, the directive must appear before ASSERT.H is included.

翻譯過來大概意思就是assert是通過判斷其參數的真假來標識程序的邏輯錯誤,調試結束后可以通過定義NDEBUG來關閉assert斷言。

查看include/assert.h頭文件可以得到assert相關的宏寫義如下:

復制代碼 代碼如下:

#ifdef  NDEBUG

#define assert(exp)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _assert(void *, void *, unsigned);

#ifdef  __cplusplus
}
#endif

#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )

#endif  /* NDEBUG */


解釋:
復制代碼 代碼如下:

  #ifdef NDEBUG
      #define assert(_Expression)  ((void)0)//當調試完成后,如果定義了NDEBUG,關閉斷言,優化生成的代碼

接下來的代碼意思是定義如下函數(此函數用于打印出出錯信息):
復制代碼 代碼如下:

_wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

有興趣的可以在assert.c中看到其實現,函數先要把錯誤的報告模式以及程序的類型(控制臺程序還是GUI程序)決定assert是向標準錯誤輸出打印還是以消息框形式出現,最后調用了abort()函數來終止程序的運行。 對于extern “C” 有時間再解釋

好了,到最后,終于看到了assert的宏定義了

復制代碼 代碼如下:

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

解釋_Expresssion若為false,則!false=true,!true=false,此時繼續執行||以后的語句,故會打印出出錯信息,終止程序,若_Expression為true,則!true=false,!false=true,此時不再執行||以后的語句,故不會打印出信息。

值得注意的是,里面有一個逗號表達式,有興趣的可以研究一下,逗號表達式如下

復制代碼 代碼如下:

(_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)

asset斷言后返回的結果始終是void(1)/void(0),原因就在于逗號表達式。

Assert斷言在程序的作用

Assert的例子:



解釋:因為tmp=0,tmp==1為false,故程序運行的時候傳給assert宏的參數為false,因此調用的結果是先向stderr打印一條出錯信息,然后通過調用 abort 來終止程序運行。如果改成tmp=1,則程序完全正常運行。 如里在程序中想關閉assert宏斷言,可以如下defnie NDEBUG

 
你會發現即出tmp=0,也不會再出現斷言信息,解釋請看頂部

作用:
1:斷言可以用來檢查傳給函數參數的合法性

復制代碼 代碼如下:

void max(int *a, int n)
{
 assert(a!=null)//利用斷言確保傳給函數的參數不是一個空指針
}

2:一個斷言一般只用來檢查一個條件,便于分析程序【大師寫的<<編程珠璣>>斷言的藝術一個斷言可以&&與||好幾個條件,在我們不是大師之前,還最好不要這樣做~~~】

3: 斷言前后最好空一格[編程風格的問題,按你自已的喜好,適合自已就最好]

4:斷言只是用來檢查程序的邏輯正確性,不能代替條件替換

5:斷言比printf語句這種形式的打印好使~~~~

6:斷言參數可以是函數調用,但是函數返回值要是真假,如assert(sort()),解釋看上面源碼分析

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久一区| 国产在线观看一区二区三区| 久久久免费精品视频| 国产欧美日韩精品在线观看| 午夜精品久久久久久久99黑人| 成人国产亚洲精品a区天堂华泰| 久久久久久亚洲精品不卡| 日韩理论片久久| 久久国产精品偷| 亚洲欧美综合精品久久成人| 欧美日韩亚洲高清| 精品美女国产在线| 国产精品久久久久久久久影视| 精品人伦一区二区三区蜜桃网站| 日韩精品在线电影| 国产精品人人做人人爽| 久久99精品视频一区97| 成人中文字幕+乱码+中文字幕| 亚洲三级av在线| xxav国产精品美女主播| 欧美日韩美女在线观看| 色www亚洲国产张柏芝| 国产精品精品久久久久久| 日韩av在线免费观看| 国产精品狠色婷| 欧美成人午夜剧场免费观看| 97成人超碰免| 亚洲激情视频在线| 国产精品自产拍在线观看中文| 日韩av电影在线免费播放| 欧美大学生性色视频| 国产精品麻豆va在线播放| 久久久久久中文| 国产精品久久久久久av| 国产69久久精品成人看| 疯狂做受xxxx欧美肥白少妇| 亚洲女人天堂色在线7777| 精品美女永久免费视频| 国产亚洲精品久久久优势| www.亚洲人.com| 久久精品视频导航| 国产精品自拍偷拍| 亚洲综合成人婷婷小说| 日韩精品高清视频| 日本高清视频一区| 日韩在线激情视频| 日韩电影中文字幕在线| 欧美大尺度电影在线观看| 久久久噜噜噜久久| 国产精品国产三级国产aⅴ浪潮| 热久久免费视频精品| 91av网站在线播放| 欧美日韩成人精品| 亚洲人成网7777777国产| 丝袜亚洲另类欧美重口| 91探花福利精品国产自产在线| 久久影院在线观看| 精品免费在线观看| 国产999精品久久久影片官网| 国产精品电影观看| 成人精品久久久| 欧美亚洲成人xxx| 在线日韩中文字幕| 在线观看日韩视频| 高跟丝袜一区二区三区| 成人www视频在线观看| 欧美日韩美女在线观看| 日韩欧美亚洲综合| 国产精品福利无圣光在线一区| 色综合天天综合网国产成人网| 亚洲午夜av电影| 亚洲成人av中文字幕| xxxxx91麻豆| 红桃av永久久久| 亚洲日本中文字幕免费在线不卡| 久久久精品中文字幕| 国产精品永久在线| 久久久久久国产三级电影| 91成人国产在线观看| 国产欧美日韩精品专区| 日本中文字幕久久看| 亚洲女人被黑人巨大进入| 欧美亚洲成人网| 欧美视频专区一二在线观看| 91九色视频在线| 亚洲最大av网站| 国产伊人精品在线| 岛国视频午夜一区免费在线观看| 欧美黄色片免费观看| 国产精品久久久久久影视| 欧美日韩国产麻豆| 91久久精品美女高潮| 亚洲性无码av在线| 91精品在线看| 亚洲石原莉奈一区二区在线观看| 亚洲国产成人在线视频| 国产精品入口免费视频一| 亚洲人午夜精品免费| 91精品国产91久久久久久| 日本高清久久天堂| 欧美午夜片在线免费观看| 富二代精品短视频| 91欧美精品午夜性色福利在线| 在线观看日韩专区| www欧美xxxx| 欧美大尺度电影在线观看| 国产精品v日韩精品| 国产欧美久久一区二区| 精品久久久久人成| 国产成人免费av电影| 亚洲国产精品电影| 亚洲第一二三四五区| 精品久久久国产精品999| 日韩在线观看免费网站| 亚洲精品中文字| 欧美特黄级在线| 久久精品中文字幕免费mv| 日韩av电影免费观看高清| 国产成人一区二| 久久精品这里热有精品| 欧美诱惑福利视频| 国产综合福利在线| 亚洲小视频在线观看| 中文字幕在线看视频国产欧美| 国产精品日韩在线| 亚洲欧洲一区二区三区久久| 日韩视频―中文字幕| 成人国产在线视频| 亚洲视频在线观看免费| 96精品久久久久中文字幕| 亚洲精品美女网站| 久青草国产97香蕉在线视频| 欧洲中文字幕国产精品| 国产原创欧美精品| 国产小视频国产精品| 91国内在线视频| 在线观看日韩www视频免费| 亚洲欧美一区二区三区在线| 欧美精品精品精品精品免费| 亚洲综合自拍一区| 欧美日韩国产综合视频在线观看中文| 亚洲xxx大片| 尤物tv国产一区| 亚洲大尺度美女在线| 45www国产精品网站| 色综合影院在线| 久久久精品视频成人| 国产女精品视频网站免费| 亚洲一区二区免费在线| 国产精品青青在线观看爽香蕉| 92看片淫黄大片看国产片| 久久精品视频亚洲| 国产a∨精品一区二区三区不卡| 欧美天天综合色影久久精品| 国产精品精品视频一区二区三区| 国产成人亚洲综合91| 亚洲天堂一区二区三区| 日av在线播放中文不卡| 国产欧美日韩精品丝袜高跟鞋| 色偷偷91综合久久噜噜| 91九色国产社区在线观看| 久久夜精品va视频免费观看| 欧美裸体xxxx极品少妇| 国产精品美女999|