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
计算 true
或 false
(bool
值!)是nullptr
还是不是
然后将这个 bool
值与 NULL
进行比较,后者是一个实现定义的空指针常量(不鼓励使用它,因为我们现在有 nullptr
)。 NULL
将转换为 bool
(变为 false
)。此 false
值与来自 !ptr
的 bool
进行比较。这种比较恰好做了预期的事情。
但是,据推测,比较的目的不是这样。
正确的版本可能是 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)
,这与您想要的完全相反。
我遇到了以下针对指针的空检查 ptr
if(!ptr == NULL){
delete ptr;
ptr = NULL;
}
现在,除了使用 NULL
而不是受欢迎的 nullptr
之外,我想知道这段代码是否有意义并且是否能保证按照 C++ 标准的含义工作。
检查 msvc 调试器,它做了它应该做的,即仅当 ptr 不同于 NULL
时才执行删除。但我似乎不明白为什么这在
if(ptr){...}
同样有效。
这段代码写得很糟糕。 GCC 和 clang 都会为此发出警告。不幸的是,MSVC 没有。
在表达式中,!ptr == NULL
、!ptr
将根据 ptr
计算 true
或 false
(bool
值!)是nullptr
还是不是
然后将这个 bool
值与 NULL
进行比较,后者是一个实现定义的空指针常量(不鼓励使用它,因为我们现在有 nullptr
)。 NULL
将转换为 bool
(变为 false
)。此 false
值与来自 !ptr
的 bool
进行比较。这种比较恰好做了预期的事情。
但是,据推测,比较的目的不是这样。
正确的版本可能是 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)
,这与您想要的完全相反。