我不明白的目的assert().
我的讲师说断言的目的是发现错误.
例如 :
double divide(int a , int b )
{
assert (0 != b);
return a/b;
}
Run Code Online (Sandbox Code Playgroud)
以上断言是否合理?我认为答案是肯定的,因为如果我的程序不应该使用0(数字为零),但不知何故零确实进入b变量,那么代码就出了问题.
我对么 ?
你能告诉我一些合理的断言()的例子吗?
问候
Jam*_*nze 16
assert用于验证在程序正确时应始终为true的事物.assert在你的例子中是否合理取决于以下规范divide:if b != 0是一个先决条件,那么assert通常是验证它的首选方式:如果有人在没有满足前提条件的情况下调用函数,那就是编程错误,你应该终止程序在极端偏见的情况下,做尽可能少的额外工作.(通常.有些应用程序不是这种情况,并且最好抛出一个异常,然后绊倒,希望最好.)但是,如果规范divide定义了somw行为b
== 0(例如返回+/- Inf),然后你应该实现它而不是使用断言.
此外,assert如果事实证明它需要太多运行时间,则可以关闭它.但是,一般情况下,这只应在代码的关键部分完成,并且只有在分析器显示您确实需要它时才能执行.
FWIW:不相关的问题,但你已经发布的代码将返回0.0了divide( 1, 3 ).不知何故,我不认为这是你想要的.
断言的另一个方面:
它们也是一种文档.
而不是评论
// ptr is never NULL
// vec has now n elements
Run Code Online (Sandbox Code Playgroud)
更好写
assert(ptr!=0);
assert(vec.size()==n);
Run Code Online (Sandbox Code Playgroud)
评论可能会随着时间的推移而过时,并会引起混淆.但断言一直在被证实.
评论可以忽略.断言不能.
assert除了您assert在调试阶段通常使用的事实外,您在评估中非常注重...这是因为您不希望assert在生产代码期间触发...抛出异常(并且正确处理它们)是生产级代码中运行时错误管理的正确方法.
但一般来说,assert用于测试假设.如果在调试阶段代码中没有满足假设条件,特别是当您获得超出所需输入值的值时,您希望程序在遇到错误时挽救,这样您可以解决它.例如,假设您正在调用返回指针的函数,并且该函数永远不应返回NULL指针值.换句话说,返回一个NULL值不仅仅是错误条件的一些指示,而是意味着假设你的代码如何工作是错误的.这是一个好用的地方assert...你假设你的程序会以一种方式工作,如果没有,那么你不希望这个错误传播到其他地方引起一些疯狂的难以找到的bug ...你想要在它发生时把它弄好.
最后,您可以将内置宏与assert诸如此类结合起来__LINE__,__FILE__这将为您提供发生断言的代码中的文件和行号,以帮助您快速识别问题区域.
| 归档时间: |
|
| 查看次数: |
487 次 |
| 最近记录: |