所以阅读一些代码,并且有一个我不明白的语法。
代码是这样的
int * aPtr = new int();
if(!aPtr) // this part I don't understand
{
//some code here
}
我猜语法是询问指针是否指向null,但在我读过的大多数书中,通常都是这样表述的
if(aPtr == NULL)
{
}
你的问题有三个重点
空指针的计算结果为零:
空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为零...(§ 4.10 /1)
所以要检查一个指针是否为空,你可以检查它是否为零。检查变量是否为零的传统方式(来自 C 的传统方式)是
if (!var) // if (var == 0)
NULL
?它是一个积分常数表达式,其计算结果为零,但是.. 忘记使用NULL
,使用0
ornullptr
代替。有关更多信息,请阅读“我应该使用 NULL 还是 0?”
new
失败与否?...当 C++ 程序更喜欢空指针结果作为错误指示而不是 bad_alloc 异常时,它由 new-expression 的放置版本调用。(18.6.1.1 / 5)
int *aPtr = new int();
if(!aPtr)
看来您想检查是new
成功还是失败。这是错误的,因为如果失败,它会抛出异常,并且程序将无法访问if (!aPtr)
. 因此,您应该按try/catch
.
此外,您可以强制编译器停止抛出异常并返回 null。为此,您应该尝试:
int* aPtr = new(std::nothrow) int();
aptr
如果它不是nullptr
. 这基本上是一种较短的说法:
if (aptr == nullptr)
运算符!
否定它的论点
大多数 c++ 编译器/库中的 NULL 值被定义为整数零 (0),这不太正确,但无论如何
所以运营商!否定整数值,如果该值为 0(即指针为 NULL) - 那么我们有true
但在一般情况下 - 依赖于此是不好的做法,您应该与 nullptr 进行比较
更新:根据评论和标准 - 您可以预期 NULL 被评估为 0,因此您可以安全地使用if (pointer)
or if (!pointer)
,但我个人更喜欢将它与适当的 const 进行比较,因为它清楚地看到它是指针而不仅仅是整数值
!用于逻辑非运算符。附加到指针时,如果指针为空,则返回 true。