c++ - 为什么我不能使用 if 语句而不是在 C++ 中使用 assert?

标签 c++ if-statement exception assert

<分区>

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

Usage of assert

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

Usage of if

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

谁能指出两者之间的区别以及使用其中一种的优势?

此外,为什么大多数人在这里更喜欢 assert 而不是 if

最佳答案

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

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

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

但是,这里有你的功能:

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

你是说可以将一个空指针传递给这个函数,只是在那种情况下它什么都不做。

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

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

这与 assert 做的事情本质上是一样的(尽管没有有用的诊断消息)。这里的区别在于,如果定义了 NDEBUG,断言就会消失。此函数(带有 if, then abort)将在所有情况下进行检查。

关于c++ - 为什么我不能使用 if 语句而不是在 C++ 中使用 assert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946673/

相关文章:

python - 使用 Bazel 编译带有 Python.h 导入的 C++ 文件

c - 需要左值作为赋值的左操作数 - 错误? : in C

php - 重定向返回后如何保留已输入的值

c++ - Blob 跟踪算法

c++ - 当我们使用 mpi_send/receive 函数时到底发生了什么?

c++ - Spectra 的 SymEigsShiftSolver 不返回特征向量吗?

C# if 语句 != 到多个值

c++ - catch 站点异常的常见用法是什么?

c# - 为什么超出范围的索引不会为 Regex GroupCollection 抛出异常?

C++:从堆栈溢出中获取异常?