断言
在我学习编程时,我一直认为断言(assert)是个报错函数,事实上,它居然是个宏,并且作用并非"报错"。
我们先来看看百度的断言的含义:
-
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
-
使用断言可以创建更稳定、品质更好且 不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。
在经过对其进行一定了解之后,对其作用及用法有了一定的了解,断言assert是定义在assert.h中的 宏 ,只在debug版本起作用,而在release版本不起作用。用法:assert(表达式)
- 当表达式的值为真的时候,也就是假设成立的时候,系统继续运行;但是当表达式的值为假,也就是假设不成立的时候,他就会中断程序执行,并且报告错误所在行。
do
{
printf("input m(m>=0):");
scanf("%d",&m);
}while(m<0); //当m>=0,不再输入
assert(m>=0); //退出上面的输入后,发现输入的值比0小,中断程序,断言为假
上面的代码中,assert(m>=0)的效果与语句if(m<0) exit(1);类似,理论上来说条件语句可以用来替代断言,但是使用条件语句后:
1.程序编译后的目标代码体积变大
2.降低最终发布的程序效率
**使用断言**:
1.便于在程序调试时发现错误
2.不会影响程序执行效率
断言只能用于调试,不能作为程序的功能。断言不是用来检查程序的错误的,断言为假只会中断程序的执行,报告程序是错误的,而不会对错误进行相应的处理。断言不能用来判断有可能发生的情况是否会发生,不能对函数的入口参数进行合法性检查,不能用断言代替条件语句,不能用断言判断有可能发生的错误,只能用于检查程序中不能发生的错误确实不会发生
适合使用断言的情况:
-
检查程序中各种假设的正确性,eg确定一个计算结果确实在合理的范围内;
-
证明或者测试某种不可能发生的状况确实不会发生,eg:一些理论上不会被执行到的分支,确实不会被执行;
使用断言的基本原则:
-
使用断言可以捕获不应该或者不可能发生的情况,不等同于非法情况
-
一个assert只能检验一个假设