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)
任何人都可以指出两者之间的区别以及使用其中一种的优势吗?
另外,为什么大多数人喜欢assert在if这里?
断言不应该在正确的代码中触发。如果是,则说明您的代码中存在错误,需要对其进行修复。所以使用这样的函数:
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)将在所有情况下进行检查。