c++ - C++ 中的指针否定 (!ptr == NULL)
问题描述
我遇到了以下针对指针的空检查ptr
if(!ptr == NULL){
delete ptr;
ptr = NULL;
}
现在,除了 usingNULL
而不是 favoured之外nullptr
,我想知道这段代码是否有意义,并且可以通过 C++ 标准的含义来保证工作。
使用 msvc 调试器检查,它会做它应该做的事情,即仅当 ptr 不同于NULL
. 但我似乎不明白为什么这可以工作
if(ptr){...}
也会起作用。
解决方案
这是写得很糟糕的代码。GCC 和 clang 都会为此发出警告。不幸的是,MSVC 没有。
在表达式中,!ptr == NULL
,!ptr
将根据is或 not计算true
or false
(一个值!)。bool
ptr
nullptr
然后将该bool
值与 进行比较NULL
,这是一个实现定义的空指针常量(不鼓励使用它,就像我们nullptr
现在所做的那样)。将NULL
转换为bool
(变为false
)。该false
值与bool
来自的值进行比较!ptr
。这种比较恰好做了预期的事情。
但是,据推测,比较不是这样的。
正确的版本可能是if (!(ptr==NULL))
. 或if (ptr!=NULL)
。或您的简单版本,if (ptr)
.
请注意,比较是不必要的(因为delete
处理nullptr
指针),所以代码可能很简单:
delete ptr;
ptr = nullptr;
推荐阅读
- git - Git 从另一个远程仓库拉取
- sharepoint - PNP.js 添加项目功能在 sharepoint 自定义中不起作用
- python - 如何对特定模式进行字符串拆分、匹配和输出?
- php - POST 在 CodeIgniter 中不工作,而 GET 工作正常
- javascript - 从特定格式的字符串中获取变量列表
- javascript - 如何修复我的代码中的 javascript 已用时间问题
- game-maker - 触发数组编号后更新全局变量
- java - 将一个数组的每个元素乘以另一个数组的每个元素并对新的非常大的数组进行排序
- python - 除了换行符之外,如何从包含杂散回车符的文本文件中加载 numpy 数组?
- windows-installer - 强制 msi 以管理员身份运行