首页 > 解决方案 > C++ 中的指针否定 (!ptr == NULL)

问题描述

我遇到了以下针对指针的空检查ptr

if(!ptr == NULL){
delete ptr;
ptr = NULL;
}

现在,除了 usingNULL而不是 favoured之外nullptr,我想知道这段代码是否有意义,并且可以通过 C++ 标准的含义来保证工作。

使用 msvc 调试器检查,它会做它应该做的事情,即仅当 ptr 不同于NULL. 但我似乎不明白为什么这可以工作

if(ptr){...}

也会起作用。

标签: c++pointersoperators

解决方案


这是写得很糟糕的代码。GCC 和 clang 都会为此发出警告。不幸的是,MSVC 没有。

在表达式中,!ptr == NULL,!ptr将根据is或 not计算trueor false(一个值!)。boolptrnullptr

然后将该bool值与 进行比较NULL,这是一个实现定义的空指针常量(不鼓励使用它,就像我们nullptr现在所做的那样)。将NULL转换为bool(变为false)。该false值与bool来自的值进行比较!ptr。这种比较恰好做了预期的事情。

但是,据推测,比较不是这样的。

正确的版本可能是if (!(ptr==NULL)). 或if (ptr!=NULL)。或您的简单版本,if (ptr).

请注意,比较是不必要的(因为delete处理nullptr指针),所以代码可能很简单:

delete ptr;
ptr = nullptr;

推荐阅读