鉴于此代码:
#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我能得到什么?
问候
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
。
有时,您假设某件事不会发生,并且您不想处理它。您只需表达您的惊讶并使用断言停止程序执行即可。
assert
仅针对debug构建启用;它没有为 release 版本启用(即定义 NDEBUG
时),这意味着在发布版本中不会进行检查;因此,与使用 if
条件(也保留在发布版本中)的代码相比,您的代码会更快一些。
这意味着,
assert
用于在编写代码时检查常见错误,并在开发阶段尽快捕获它们。
很多原因:
if()
本身什么也不做。if()
语义更清晰。如果断言失败,您将看到包含失败断言本身的输出,以及失败断言的函数和行,类似于:
test: main.cpp:9: int main(): Assertion `0==1' failed.
因此,如果您的程序在运行时崩溃,您将看到崩溃的确切原因和位置。 wiki 中有一篇关于断言的大文章。
Assert 会通知您发生了错误,可能需要修复错误。在调试模式下,它将中断并显示调用堆栈,这将帮助您修复错误。所以这是一个很好的使用习惯。我实际上会使用 if() 和断言,因为在发布中你的断言应该被关闭:
void print_number(int* somePtr) {
assert(somePtr != NULL);
if (somePtr != NULL)
printf ("%d\n",*somePtr);
// else do something
}
在“ // else do some ”中,你可能会想到抛出异常或返回错误代码。
如果您的 (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); }