珠海哪里做網(wǎng)站的網(wǎng)絡(luò)怎么做推廣
目錄
一、前言
二、什么是 assert ??
?三、assert 的用法
?四、assert 案例解析
?五、assert 斷言的使用原則
六、共勉?
一、前言
? ? ? 在編寫程序過程中,尤其是調(diào)試代碼時,往往需要一個提醒代碼漏洞/Bug的小助手,以便于程序員及時修改和完善代碼。那么assert關(guān)鍵字就可以成為這個小助手。
二、什么是 assert ??
?概念:C/C++ 中的?
assert
?是一個宏,用于在運行時檢查一個條件是否為真,如果條件不滿足,則運行時將終止程序的執(zhí)行并輸出一條錯誤信息。
- assert 宏定義在 <assert.h> 或 <cassert> 頭文件中,并接受一個參數(shù),通常為一個語句。
- 如果這個語句的結(jié)果為 false,assert 宏就會以"Assertion failed: , file , line "的形式顯示出錯信息,然后使程序崩潰并終止運行。如果該語句的結(jié)果為 true,則 assert 宏不做任何操作。
作用:?
assert
?宏的使用可以幫助程序員檢查程序的正確性,并提供幫助定位錯誤的一種手段。通常在程序編寫的測試與調(diào)試階段使用?assert
?來追蹤程序執(zhí)行中的錯誤,并在最終發(fā)布程序時關(guān)閉?assert
?檢查,以提升程序的運行效率。
?三、assert 的用法
?語法:
- assert(condition);
- condition:要判斷的條件
?說明:
?
- a、如果condition判斷結(jié)果為false,則程序就會停止執(zhí)行。
- b、當(dāng)程序停止執(zhí)行時,assert就會斷言失敗,并輸出一條程序的錯誤信息到控制臺或日志文件中。
- c、assert關(guān)鍵字常常用于調(diào)試程序階段,可以用來幫助程序員在程序出現(xiàn)異?;蝈e誤時,快速定位問題所在,以便于檢查和就修改完善。
- d、而在程序正常部署后,assert一般就會被自動關(guān)閉。
?四、assert 案例解析
案例1 : 比大小
#include <cassert>
#include <iostream>
using namespace std;int main() {int a = 10, b = 20;assert(a > b); // 條件不成立,程序會終止cout << a + b << endl;return 0;
}
- ?在這個例子中,條件?
a > b
?不成立,程序就會在?assert
?這個語句處崩潰,輸出一條相應(yīng)的錯誤信息。
案例2?: 模擬 strlen() 函數(shù)?
/*例程1*/
#include <stdio.h>
#include <assert.h>
#include <string.h>//size_t --- unsigned int
size_t My_strlen(const char* str)//參數(shù)傳數(shù)組首地址
{assert("str != NULL");//注意:這里我把斷言取消了,要用時把雙引號去掉即可//斷言,判斷是否傳的空地址,及時報錯糾正int count = 0;//計數(shù)//是假就不執(zhí)行while循環(huán)//是真則執(zhí)行,函數(shù)體//不斷判斷后加加(后置++,先用后加),數(shù)組元素是否為字符串結(jié)束標(biāo)志位'\0'while (*str != '\0'){str++;count++;}return count;
}
int main()
{char arr[] = "hello bit!!!";int len = My_strlen(arr);printf("%d\n", len);//12return 0;
}
?小結(jié):
- a、斷言需要引用頭文件,<assert.h>
- b、斷言,作用是指出代碼報錯的位置/方便查找原因
?五、assert 斷言的使用原則
? ? ? ? assert() 是一個調(diào)試程序時經(jīng)常使用的宏,在程序運行時它計算括號內(nèi)的表達式,如果表達式為 false?(0), 程序?qū)蟾驽e誤,并終止執(zhí)行。如果表達式不為0,則繼續(xù)執(zhí)行后面的語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時也便于查找錯誤。
- (1)使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
- (2)使用斷言對函數(shù)的參數(shù)進行確認(rèn)。
- (3)在編寫函數(shù)時,要進行反復(fù)的考查,并且自問:"我打算做哪些假定?"一旦確定了的假定,就要使用斷言對假定進行檢查。
- (4)一般教科書都鼓勵程序員們進行防錯性的程序設(shè)計,但要記住這種編程風(fēng)格會隱瞞錯誤。當(dāng)進行防錯性編程時,如果"不可能發(fā)生"的事情的確發(fā)生了,則要使用斷言進行報警。
注意:assert?只有在 Debug 版本中才有效,如果編譯為 Release 版本則被忽略。?
六、共勉?
?以下就是我對?assert 斷言?的理解,如果有不懂和發(fā)現(xiàn)問題的小伙伴,請在評論區(qū)說出來哦,同時我還會繼續(xù)更新對C++? vector?類的理解,請持續(xù)關(guān)注我哦!!!??