Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Assert()-它有什么好处?_C++_Assert - Fatal编程技术网

C++ Assert()-它有什么好处?

C++ Assert()-它有什么好处?,c++,assert,C++,Assert,我不明白assert()的目的 我的讲师说assert的目的是发现bug 例如: double divide(int a , int b ) { assert (0 != b); return a/b; } 上述断言是否合理?我认为答案是肯定的,因为如果我的程序 不应该与0(数字零)一起工作,但不知何故,零确实会进入b变量,那么代码就有问题了 我说得对吗 你能给我看一些关于合理的断言()的例子吗 关于断言的目的是在调试期间发出意外行为的信号(因为它仅在调试版本中可用)。你的例子是一个

我不明白
assert()
的目的

我的讲师说assert的目的是发现bug

例如:

double divide(int a , int b ) 
{
  assert (0 != b);
  return a/b;
}
上述断言是否合理?我认为答案是肯定的,因为如果我的程序 不应该与
0
(数字零)一起工作,但不知何故,零确实会进入
b
变量,那么代码就有问题了

我说得对吗

你能给我看一些关于合理的断言()的例子吗


关于

断言的目的是在调试期间发出意外行为的信号(因为它仅在调试版本中可用)。你的例子是一个合理的断言案例。下一行可能会崩溃,但是使用assert,您可以选择在命中该行之前中断执行,并进行一些调试

这通常与异常并行进行-您断言表示有问题,并抛出异常以优雅地处理该情况(甚至退出程序):


在某些情况下,您希望继续执行,但仍然希望发出出错的信号。

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

不过,一般来说,
assert
用于测试假设。如果在调试阶段代码中未满足假定条件,特别是当您获取的值超出所需输入的界限时,您希望程序在遇到错误时退出,以便可以修复它。例如,假设您正在调用一个返回指针的函数,并且该函数不应返回
NULL
指针值。换句话说,返回一个
NULL
值不仅仅是一个错误条件的指标,它还意味着对代码工作方式的假设是错误的。这是一个使用断言的好地方。。。您假设您的程序将以一种方式工作,如果它不工作,那么您不希望错误传播到其他地方导致一些难以找到的错误。。。当它发生时,您希望立即将其禁用


最后,您可以将内置宏与
assert
相结合,例如
\uuuuuu LINE\uuuuu
\uuuu FILE\uuuuuuu
,它们将为您提供进行assert的代码中的文件和行号,以帮助您快速确定问题区域。

assert用于在调试环境中测试有关代码的假设。断言通常对最终生成没有影响

它是否有效完全是另一回事。如果不了解您的应用程序,我们无法回答此问题


断言永远不会失败。如果您看到断言可能失败,那么您需要使用If语句来处理条件不为true的情况。断言仅适用于您认为永远不会失败的条件。

assert
用于验证在 程序是正确的。在您的示例中,
assert
是否合理 取决于
divide
:if
b!=0是一个先决条件,
然后,
断言
通常是验证它的首选方法:如果 有人在不满足前提条件的情况下调用函数,这是一个 编程错误,应使用极限终止程序 偏见,尽可能少做额外的工作。(通常。 有些应用程序的情况并非如此,但事实确实如此 最好是抛出一个例外,蹒跚前行,期待最好的结果。) 但是,如果
divide的规范定义了
b时的somw行为
==0
(例如,返回+/-Inf),则应实现此功能,而不是 使用断言

此外,如果结果显示
assert
无效,也可以将其关闭 需要太多的运行时间。但是,通常情况下,这只能在 代码的关键部分,并且仅当探查器显示您 我真的需要它

FWIW:与您的问题无关,但您发布的代码将 对于
除以(1,3)
,返回
0.0
。不知怎的,我不认为这是
您想要的。

断言用于在代码执行期间检查不变量,这些是程序员假定始终保持不变的条件,如果它们与假设不同,则代码中存在错误

断言也可用于检查先决条件和后决条件,第一个断言在某些代码块之前进行检查,并验证提供的数据/状态是否正确,第二个断言检查某些计算的结果是否正确。这有助于缩小问题/bug的位置:

assert( /*preconditions*/ );
/*here some algorithm - and maybe more asserts checking invariants*/
assert( /*postconditions*/ );
有正当理由的资产的一些例子:

  • 检查函数返回值,例如,如果您调用某个外部API函数,并且您知道它仅在出现编程错误时返回某个错误值:
  • WinAPI Thread32First函数要求提供的LPTHREADENTRY32结构具有正确分配的dwSize字段,如果出现错误,则会失败。此失败应该由assert捕获

  • 若函数接受指向某些数据的指针,那个么在函数的开头添加assert以验证它是否为非null。如果此函数不能在空指针上工作,则这是有意义的

  • 如果您在设置了超时的互斥锁上有一个锁,那么如果这个超时结束,那么您可以使用断言来指示可能的竞争条件/死锁

  • 。。。还有更多

    断言的好技巧是在里面添加一些信息,例如:

    断言(假&“原因”
    assert( /*preconditions*/ );
    /*here some algorithm - and maybe more asserts checking invariants*/
    assert( /*postconditions*/ );
    
    // ptr is never NULL
    // vec has now n elements
    
    assert(ptr!=0);
    assert(vec.size()==n);