使用assert而不是使用简单的“if”的任何好处?

时间:2012-07-13 10:42:28

标签: c if-statement assert

鉴于此代码:

#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我获得了什么?

问候

6 个答案:

答案 0 :(得分:15)

断言是在代码中记录您的假设。 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函数中说,期望人们传递一个空指针。而且我知道如何处理这种情况,我确实以其他条件处理这个问题。

所以,有时你会知道如何处理某些情况而你想要这样做。然后,使用if。 有时候,你会认为某些事情不会发生,而你却无需处理它。您只需表达您的意外,并使用断言停止您的程序执行。

答案 1 :(得分:7)

区别在于std::assert仅针对调试构建启用;它未启用发布版本(即定义NDEBUG时),这意味着在发布版本中将不会进行检查;因此,与使用if条件的代码相比,您的代码会更快一些。

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

答案 2 :(得分:7)

很多原因:

  1. 发布版本通常会删除断言。
  2. 断言会向客户报告失败信息。 if()本身没有任何作用。
  3. 因为断言通常是宏,所以您还可以获得有关失败断言的代码信息。
  4. 断言在语义上比if()更清晰。

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:3)

断言会告诉您发生了错误,可能会修复错误。在调试模式下,它将断开并显示将帮助您修复错误的callstack。所以使用它是一个很好的做法。我实际上会使用if()和assert,因为在Release中你的断言应该被关闭:

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

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

答案 5 :(得分: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); }