断言() - 有什么好处?

JAN*_*JAN 4 c++ assert

我不明白的目的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.0divide( 1, 3 ).不知何故,我不认为这是你想要的.


rtl*_*mpf 7

断言的另一个方面:
它们也是一种文档.

而不是评论

// 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)

评论可能会随着时间的推移而过时,并会引起混淆.但断言一直在被证实.
评论可以忽略.断言不能.


Jas*_*son 5

assert除了您assert在调试阶段通常使用的事实外,您在评估中非常注重...这是因为您不希望assert在生产代码期间触发...抛出异常(并且正确处理它们)是生产级代码中运行时错误管理的正确方法.

但一般来说,assert用于测试假设.如果在调试阶段代码中没有满足假设条件,特别是当您获得超出所需输入值的值时,您希望程序在遇到错误时挽救,这样您可以解决它.例如,假设您正在调用返回指针的函数,并且该函数永远不应返回NULL指针值.换句话说,返回一个NULL值不仅仅是错误条件的一些指示,而是意味着假设你的代码如何工作是错误的.这是一个好用的地方assert...你假设你的程序会以一种方式工作,如果没有,那么你不希望这个错误传播到其他地方引起一些疯狂的难以找到的bug ...你想要在它发生时把它弄好.

最后,您可以将内置宏与assert诸如此类结合起来__LINE__,__FILE__这将为您提供发生断言的代码中的文件和行号,以帮助您快速识别问题区域.

  • 你已经倒退了.`assert`默认是活动的; 你必须定义预处理器符号`NDEBUG`来关闭它.(你应该只在探查者说你必须做的事情.) (2认同)