目录
一、前言
在编写程序过程中,尤其是调试代码时,往往需要一个提醒代码漏洞/Bug的小助手,以便于程序员及时修改和完善代码。那么assert关键字就可以成为这个小助手。
二、什么是 assert ?
概念:C/C++ 中的
assert
是一个宏,用于在运行时检查一个条件是否为真,如果条件不满足,则运行时将终止程序的执行并输出一条错误信息。
- assert 宏定义在 <assert.h> 或 <cassert> 头文件中,并接受一个参数,通常为一个语句。
- 如果这个语句的结果为 false,assert 宏就会以"Assertion failed: , file , line "的形式显示出错信息,然后使程序崩溃并终止运行。如果该语句的结果为 true,则 assert 宏不做任何操作。
作用:
assert
宏的使用可以帮助程序员检查程序的正确性,并提供帮助定位错误的一种手段。通常在程序编写的测试与调试阶段使用assert
来追踪程序执行中的错误,并在最终发布程序时关闭assert
检查,以提升程序的运行效率。
三、assert 的用法
语法:
- assert(condition);
- condition:要判断的条件
说明:
- a、如果condition判断结果为false,则程序就会停止执行。
- b、当程序停止执行时,assert就会断言失败,并输出一条程序的错误信息到控制台或日志文件中。
- c、assert关键字常常用于调试程序阶段,可以用来帮助程序员在程序出现异常或错误时,快速定位问题所在,以便于检查和就修改完善。
- d、而在程序正常部署后,assert一般就会被自动关闭。
四、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
这个语句处崩溃,输出一条相应的错误信息。
案例2 : 模拟 strlen() 函数
/*例程1*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
//size_t --- unsigned int
size_t My_strlen(const char* str)//参数传数组首地址
{
assert("str != NULL");//注意:这里我把断言取消了,要用时把双引号去掉即可
//断言,判断是否传的空地址,及时报错纠正
int count = 0;//计数
//是假就不执行while循环
//是真则执行,函数体
//不断判断后加加(后置++,先用后加),数组元素是否为字符串结束标志位'\0'
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "hello bit!!!";
int len = My_strlen(arr);
printf("%d\n", len);//12
return 0;
}
小结:
- a、断言需要引用头文件,<assert.h>
- b、断言,作用是指出代码报错的位置/方便查找原因
五、assert 断言的使用原则
assert() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为 false (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
- (1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
- (2)使用断言对函数的参数进行确认。
- (3)在编写函数时,要进行反复的考查,并且自问:"我打算做哪些假定?"一旦确定了的假定,就要使用断言对假定进行检查。
- (4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果"不可能发生"的事情的确发生了,则要使用断言进行报警。
注意:assert 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略。
六、共勉
以下就是我对 assert 断言 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++ vector 类的理解,请持续关注我哦!!!