使用断言而不是使用简单的“if”有什么好处?

问题描述 投票:0回答:6

鉴于此代码:

#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我能得到什么?

问候

c if-statement assert
6个回答
30
投票

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
函数中,我期望人们传递一个空指针。我知道如何处理这种情况,并且我确实用
else
条件来处理这种情况。

所以,有时你会知道如何处理某些情况并且你想这样做。然后,使用

if
。 有时,您假设某件事不会发生,并且您不想处理它。您只需表达您的惊讶并使用断言停止程序执行即可。


14
投票

区别在于,

assert
仅针对debug构建启用;它没有为 release 版本启用(即定义
NDEBUG
时),这意味着在发布版本中不会进行检查;因此,与使用
if
条件(也保留在发布版本中)的代码相比,您的代码会更快一些。

这意味着,

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


10
投票

很多原因:

  1. 发布版本中通常会删除断言。
  2. 断言会向客户端报告失败信息。
    if()
    本身什么也不做。
  3. 由于断言通常是宏,因此您还可以获得有关失败断言的代码信息。
  4. Assert 比
    if()
    语义更清晰。

7
投票

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

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

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


3
投票

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

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

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


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); }
© www.soinside.com 2019 - 2024. All rights reserved.