关于c++中的assert语句

2024-12-14 18:41:34
推荐回答(5个)
回答1:

assert一般是一个条件编译的宏,什么意思呢?简单说来,如果写成if,那么程序执行的时候需要额外开销来进行判断,如果调用很多次,将会影响程序性能,而实际上有一些判断,在调试的时候判断就可以了,等编译成为真正的线上产品的时候,其实是不需要的,因为如果调试的时候没有问题,最后就不会有问题。再简单点说,就是你自己写代码,调试的时候,你自己想做一些检查,而当你把你的程序拿给别人使用的时候,你想去掉那些检查从而尽可能提高执行速度,就用assert。具体就是通过条件编译来实现的,通过编译参数控制,调试的时候把assert当if使用,成品的时候不编译那段代码。

另外,assert还有一个好处就是assert失败是能自动输出更详细的出错信息,从而看出是哪里出错了,以便检查代码。如果用if,只能一个一个自己写,比如if(...) printf(...); 非常麻烦

回答2:

C里用法:
使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。
除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。
使用断言使我们向按契约式设计更近了一步。
断言特性:
前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性
使用方式:
断言可以有两种形式
1.assert Expression1
2.assert Expression1:Expression2
其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。如果Expression1为假,则抛出一个 AssertionError,这是一个错误,而不是一个异常,也就是说是一个不可控制异常(unchecked Exception),AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。
java断言:
断言在默认情况下是关闭的,要在编译时启用断言,需要使用source1.4标记 既javac source1.4 Test.java ,在运行时启用断言需要使用 -ea参数 。要在系统类中启用和禁用断言可以使用 -ea和 -dsa参数。

回答3:

在真正的大型程序中,出问题的概率是非常大的,而出了问题如何解决,有时比较困扰,因为代码可能几百万行
就算你写if(p==NULL)也只是做的一些规避
正确的做法是加assert目的就在于,当条件是false时,assert让程序中止,输出错误所在的代码块,这样才方便分析和解决问题。
断言常用在程序开发过程中,程序员不想写更多的异常处理代码,又想立即定位到异常的位置,在DEBUG模式下断言就起到了关键的作用,大大提高开发效率。

回答4:

哈哈!果断被鄙视啊!

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

回答5:

现在假设有如下函数,
void Func(int *p)
{
}

当调用函数时,在参数检测这一块有两种做法:
一是调用前检测(属于规范的做法);
二是寄希望于函数自己检测;

如果不在Func函数里检测参数,那么对于后者来说,当错误发生时,想快速准确地定位通常都是比较困难的;但如果在Func里加上if语句判断,那对于前者,又会有重复检测的开销.
而assert正好可以解决这个问题,assert只在debug版本中有效,在release版本中为空宏.