【C/C++】详解 assert() 断言(什么是assert? assert有什么作用?)
时间:2024-03-31 10:00:46 来源:网络cs 作者:亙句 栏目:物流仓储 阅读:
目录
一、前言
二、什么是 assert ?
三、assert 的用法
四、assert 案例解析
五、assert 断言的使用原则
六、共勉
一、前言
在编写程序过程中,尤其是调试代码时,往往需要一个提醒代码漏洞/Bug的小助手,以便于程序员及时修改和完善代码。那么assert关键字就可以成为这个小助手。
二、什么是 assert ?
assert 宏定义在 <assert.h> 或 <cassert> 头文件中,并接受一个参数,通常为一个语句。如果这个语句的结果为 false,assert 宏就会以"Assertion failed: , file , line "的形式显示出错信息,然后使程序崩溃并终止运行。如果该语句的结果为 true,则 assert 宏不做任何操作。概念:C/C++ 中的
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 intsize_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);//12return 0;}
小结:
a、断言需要引用头文件,<assert.h>b、断言,作用是指出代码报错的位置/方便查找原因
五、assert 断言的使用原则
(1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。(2)使用断言对函数的参数进行确认。(3)在编写函数时,要进行反复的考查,并且自问:"我打算做哪些假定?"一旦确定了的假定,就要使用断言对假定进行检查。(4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果"不可能发生"的事情的确发生了,则要使用断言进行报警。assert() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为 false (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
注意:assert 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略。
六、共勉
以下就是我对 assert 断言 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++ vector 类的理解,请持续关注我哦!!!
本文链接:https://www.kjpai.cn/news/2024-03-31/151351.html,文章来源:网络cs,作者:亙句,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:web canvas系列——快速入门上手绘制二维空间点、线、面
下一篇:返回列表