为什么我不能在 C++ 中使用 if 语句而不是使用断言?

Kri*_*not 0 c++ assert if-statement exception-handling

既然assert简单地检查其参数中的语句是否为真,为什么我们不简单地使用if条件来检查呢?

断言的用法

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

if 的用法

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr); 
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出两者之间的区别以及使用其中一种的优势吗?

另外,为什么大多数人喜欢assertif这里?

Ben*_*ley 5

断言不应该在正确的代码中触发。如果是,则说明您的代码中存在错误,需要对其进行修复。所以使用这样的函数:

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

您是说永远不应将空指针传递给此函数,如果是,则传递它的代码是不正确的。

但是,在这里使用您的功能:

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr); 
}
Run Code Online (Sandbox Code Playgroud)

你是说可以向这个函数传递一个空指针,在这种情况下它不会做任何事情。

比较您的断言版本的更合适的函数是这样的:

void print_number(int* somePtr) {
  if (somePtr == NULL)
      std::abort();
  printf ("%d\n",*somePtr);
}
Run Code Online (Sandbox Code Playgroud)

这与 assert 的作用基本相同(尽管没有有用的诊断消息)。这里的区别在于断言在NDEBUG定义时消失。此函数(带有 if, then abort)将在所有情况下进行检查。