11

鉴于此代码:

#include <stdio.h>
#include <assert.h>

void print_number(int* somePtr) {
  assert (somePtr!=NULL);
  printf ("%d\n",*somePtr);
}

int main ()
{
  int a=1234;
  int * b = NULL;
  int * c = NULL;

  b=&a;

  print_number (c);
  print_number (b);

  return 0;
}

我可以这样做:

#include <stdio.h>
#include <assert.h>

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

int main ()
{
  int a=1234;
  int * b = NULL;
  int * c = NULL;

  b=&a;

  print_number (c);
  print_number (b);

  return 0;
}

那么,我通过使用 assert 获得了什么?

问候

4

6 回答 6

25

assert 是在代码中记录您的假设。if 语句用于处理不同的逻辑场景。

现在,在您的特定情况下,从 print_number() 函数的开发人员的角度考虑。

例如当你写

void print_number(int* somePtr) {
  assert (somePtr!=NULL);
  printf ("%d\n",*somePtr);
}

你的意思是说,

在我的 print_number 函数中,我假设指针总是不为空。如果这是空的,我会非常惊讶。我根本不在乎在我的代码中处理这种情况。

但是,如果你写

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

您似乎说,在我的 print_number 函数中,我希望人们传递一个空指针。而且我知道如何处理这种情况,并且我确实在其他情况下处理了这种情况。

因此,有时您会知道如何处理某些情况并且您想这样做。然后,使用如果。有时,您假设某事不会发生,并且您不想处理它。您只需表达您的惊讶并使用 assert 停止您的程序执行。

于 2012-07-13T10:45:53.590 回答
12

不同之处在于assert仅对调试构建启用;它没有为发布构建启用(即何时NDEBUG定义),这意味着在发布构建中不会有检查;if因此,与您使用仍保留在发布版本中的条件相比,您的代码会更快一些。

这意味着,assert用于在您编写代码时检查常见错误,并在开发阶段本身尽快捕获它们。

于 2012-07-13T10:47:06.147 回答
9

很多原因:

  1. 对于发布版本,断言通常会被删除。
  2. 断言会向客户端报告失败信息。if()自己什么都不做。
  3. 因为断言通常是宏,所以您还可以获得有关失败断言的代码信息。
  4. Assert 在语义上比if().
于 2012-07-13T10:50:29.930 回答
7

如果断言失败,您将看到包含失败断言本身的输出,以及失败断言的函数和行,如下所示:

test: main.cpp:9: int main(): Assertion `0==1' failed.

因此,如果您的程序在运行时崩溃,您将看到崩溃的确切原因和位置。wiki中有一篇关于断言的大文章。

于 2012-07-13T10:44:59.737 回答
3

Assert 将通知您发生了错误,可能需要修复错误。在调试模式下,它会中断并显示可以帮助您修复错误的调用堆栈。所以它是一个很好的使用习惯。我实际上会使用 if() 和断言,因为在 Release 中你的断言应该被关闭:

void print_number(int* somePtr) {
  assert(somePtr != NULL);
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

在“ // else do something ”中,您可能会想到抛出异常或返回错误代码。

于 2012-07-13T10:47:07.053 回答
1

如果您的 (if) 语句变为 True 或 False,请听,以便编译器执行下一条指令。但是在 assert.h 中,当您的语句变为假时,“程序立即终止”并带有断言消息。

例子 :*

#include <assert.h> #include <stdio.h>

int main () {

    int a;
    printf("Enter an integer value: "); scanf("%d", &a); assert(a >= 10);
    printf("Integer entered is %d\n", a);
    return(0); }
于 2021-04-14T09:42:13.870 回答