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

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

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

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

现在,除了使用 NULL 而不是受欢迎的 nullptr 之外,我想知道这段代码是否有意义并且是否能保证按照 C++ 标准的含义工作。

检查 msvc 调试器,它做了它应该做的,即仅当 ptr 不同于 NULL 时才执行删除。但我似乎不明白为什么这在

时可以工作
if(ptr){...}

同样有效。

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

在表达式中,!ptr == NULL!ptr 将根据 ptr 计算 truefalsebool 值!)是nullptr还是不是

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

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

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

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

delete ptr;
ptr = nullptr;

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

== has a lower precedence than !,因此您的条件被解析为 (!ptr) == NULL,而不是 !(ptr == NULL)

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