assert断言

assert断言 目录assert的概念assert的基本使用使用场景①检查空指针避免野指针②检查数组边界避免越界③检查函数参数的合理性注意事项①assert只用于调试发布版本需关闭②断言表达式不能有“副作用”③assert 不能替代错误处理仅给程序员调试的时候使用assert的概念assert断言是C语言中用于调试阶段检查程序逻辑正确性的宏核心作用是在运行时验证某个条件为真如果为假终止程序并打印错误信息它是程序员的 “调试助手”能快速定位开发阶段的逻辑错误比如指针为空、数组越界、参数非法等但仅用于调试发布版本需关闭。assert的基本使用#includestdio.h#includeassert.hint main() {assert(条件表达式);return 0;}如果表达式是 ture1 程序会正常运行无任何影响如果表达式式 false0程序终止打印包含文件名、行号、表达式的错误信息如Assertion failed: 0, file :文件地址目录, line 5使用场景①检查空指针避免野指针void funcint *p{//断言传入的指针不能是空指针assertpNULL*p 20;} 调用 func(NULL) 时断言触发直接定位 “传入空指针” 的错误②检查数组边界避免越界void p(int arr[],int len ,int idx){assert(idx0 idxlen)return arr[idx]} 调用 get_arr_value(arr, 5, 6) 时断言触发定位 “索引越界”③检查函数参数的合理性int p(int a,int b){//断言除数不能为0assert(b!0);return a/b;} 调用 divide(10, 0) 时断言触发避免 “除以 0” 的运行时错误。注意事项①assert只用于调试发布版本需关闭关闭方法在包含 assert.h 前定义 NDEBUG 宏#define NDEBUG // 定义后所有 assert 都会被编译器忽略 #include assert.h int main() { assert(0); // 无任何效果程序正常执行 return 0; }②断言表达式不能有“副作用”assert 的表达式在关闭后会被忽略因此不能包含赋值、自增 / 自减等改变程序状态的操作比如// 错误写法i 是副作用关闭断言后 i 不会自增int i 0;assert((i) 5);// 正确写法先运算再断言int i 0; i;assert(i 5);③assert 不能替代错误处理仅给程序员调试的时候使用