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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言断言assert()函数

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言断言assert()函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 斷言(assert)的用法
    • 用法總結與注意事項
      • 1)在函數開始處檢驗傳入參數的合法性
      • 2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗
      • 3)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這么做,會使用程序在真正運行時遇到問題
      • 4)assert和后面的語句應空一行,以形成邏輯和視覺上的一致感
      • 5)有的地方,assert不能代替條件過濾
    • 以下是使用斷言的幾個原則:

斷言(assert)的用法

我一直以為 assert 僅僅是個報錯函數,事實上,它居然是個宏,并且作用并非"報錯"。

在經過對其進行一定了解之后,對其作用及用法有了一定的了解,assert() 的用法像是一種"契約式編程",在我的理解中,其表達的意思就是,程序在我的假設條件下,能夠正常良好的運作,其實就相當于一個 if 語句:

if(假設成立) {程序正常運行; } else {報錯&&終止程序!(避免由程序運行引起更大的錯誤) }

但是這樣寫的話,就會有無數個 if 語句,甚至會出現,一個 if 語句的括號從文件頭到文件尾,并且大多數情況下,我們要進行驗證的假設,只是屬于偶然性事件,又或者我們僅僅想測試一下,一些最壞情況是否發生,所以這里有了 assert()。

assert 宏的原型定義在 assert.h 中,其作用是如果它的條件返回錯誤,則終止程序執行。

#include "assert.h" void assert( int expression );

assert 的作用是現計算表達式 expression ,如果其值為假(即為0),那么它先向 stderr 打印一條出錯信息,然后通過調用 abort 來終止程序運行。

使用 assert 的缺點是,頻繁的調用會極大的影響程序的性能,增加額外的開銷。

在調試結束后,可以通過在包含 #include 的語句之前插入 #define NDEBUG 來禁用 assert 調用,示例代碼如下:

#include #define NDEBUG #include

用法總結與注意事項

1)在函數開始處檢驗傳入參數的合法性

如:

int resetBufferSize(int nNewSize) { //功能:改變緩沖區大小, //參數:nNewSize 緩沖區新長度 //返回值:緩沖區當前長度 //說明:保持原信息內容不變 nNewSize<=0表示清除緩沖區 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ... }

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

不好:

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

好:

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

3)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這么做,會使用程序在真正運行時遇到問題

錯誤: assert(i++ < 100)

這是因為如果出錯,比如在執行之前i=100,那么這條語句就不會執行,那么i++這條命令就沒有執行。

正確:

assert(i < 100) i++;

4)assert和后面的語句應空一行,以形成邏輯和視覺上的一致感

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

程序一般分為Debug 版本和Release 版本,Debug 版本用于內部調試,Release 版本發行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用于檢查"不應該"發生的情況。以下是一個內存復制程序(?),在運行過程中,如果assert 的參數為假,那么程序就會中止(一般地還會出現提示對話,說明在什么地方引發了assert)。

以下是使用斷言的幾個原則:

  • (1)使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,后者是必然存在的并且是一定要作出處理的。
  • (2)使用斷言對函數的參數進行確認。
  • (3)在編寫函數時,要進行反復的考查,并且自問:"我打算做哪些假定?"一旦確定了的假定,就要使用斷言對假定進行檢查。
  • (4)一般教科書都鼓勵程序員們進行防錯性的程序設計,但要記住這種編程風格會隱瞞錯誤。當進行防錯性編程時,如果"不可能發生"的事情的確發生了,則要使用斷言進行報警。

ASSERT ()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式為FALSE (0), 程序將報告錯誤,并終止執行。如果表達式不為0,則繼續執行后面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重后果,同時也便于查找錯誤。

ASSERT 只有在 Debug 版本中才有效,如果編譯為 Release 版本則被忽略。

參考文章:斷言(assert)的用法

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人激情视频网站 | 97超碰站 | 黄色录像网址 | 欧美少妇毛茸茸 | 污视频网站免费 | 亚洲精品乱码久久久久久蜜桃麻豆 | 久久午夜网站 | 无套暴操 | 国产成人精品一二三区 | 精品国产乱码久久久久久免费 | 婷婷六月激情 | 久久在线观看 | 亚洲不卡在线 | 中文字幕一区二区三区电影 | 国产视频在 | 一级黄色大毛片 | 能看av的网站 | 久久99国产精品久久99果冻传媒 | 欧美性受视频 | 四虎永久在线精品免费一区二区 | 日本xxxwww| 操操操网站 | 91久久综合| 91精品免费在线观看 | 中国少妇做爰全过程毛片 | 黄色xxxxxx | 在线的av | 超碰碰97 | 日本系列第一页 | 国产男男gay体育生白袜 | 精品国内自产拍在线观看视频 | 欧美成人dvd在线视频 | 在线看一区 | 免费在线观看日韩av | av激情网站 | 亚洲va久久久噜噜噜久久天堂 | 91中文在线 | 男女交性视频播放 | 国产乱码一区二区三区 | 免费激情视频网站 | 操她视频在线观看 | 日韩三级一区二区三区 | 国产黄色网络 | 三级一区二区 | 国产成a人亚洲精品 | 野花成人免费视频 | jizz日本在线播放 | 国产精品视频一二三区 | 亚洲一区二区美女 | 黄色a级免费 | 一区二区视频免费观看 | 亚洲成a人片在线 | 九九久久久 | 黑人巨大精品欧美 | 操极品女神 | 国产精品久久久久久久一区探花 | 国产又粗又猛又黄视频 | 性感少妇av | 中国色老太hd | 国产精品美女www爽爽爽 | 村上凉子av | 黄色特级一级片 | 欧美一区二区在线视频观看 | 亚洲成人激情视频 | 在线国产网站 | 久久精品久久久精品美女 | 日韩在线观看免费全 | 久久久久久国产精品免费免费 | 免费激情 | 成年免费视频 | 久久久久久久久久一区二区 | 日韩人妻一区二区三区蜜桃 | 亚欧在线观看 | 亚州综合视频 | 黄色小视频在线看 | 亚洲免费成人av | 高潮毛片无遮挡高清免费 | 中文字幕影片免费在线观看 | 伊人日韩 | 中文字幕线人 | 国产日韩欧美在线观看视频 | 久久官网| 日本免费一区二区三区四区 | 天天射一射 | 3d动漫精品啪啪一区二区竹菊 | 蜜臀久久99精品久久久画质超高清 | 亚洲综合在线视频 | 中文字幕超碰在线 | 国产成人欧美 | 天天干天天曰 | 看了下面会湿的视频 | xx性欧美肥妇精品久久久久久 | www.欧美视频| 和美女啪啪 | 捅肌肌| 91国偷自产中文字幕久久 | 高潮无码精品色欲av午夜福利 | 日韩婷婷 | 人妻精品无码一区二区 |