C++中的指针否定 (!ptr == NULL)

Pointer negation in C++ (!ptr == NULL)

本文关键字:ptr NULL 指针 C++      更新时间:2023-10-16

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

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

现在,除了使用NULL而不是喜欢的nullptr,我想知道这段代码是否有意义,并且通过C++标准的含义保证工作。

使用 msvc 调试器检查,它会执行它应该做的事情,即仅在 ptr 与NULL不同时才执行删除。但我似乎不明白为什么这可以工作

if(ptr){...}

也会起作用。

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

在表达式中,!ptr == NULL!ptr将根据ptrnullptr计算truefalse(bool值!

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

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

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

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

delete ptr;
ptr = nullptr;

这是一个运算符优先级问题。

==的优先级低于!,所以你的条件被解析为(!ptr) == NULL,而不是!(ptr == NULL)

这大致导致(ptr != NULL) == NULL!(ptr),这与你想要的完全相反。