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
nullptr
计算true
或false
(bool
值!
然后将这个bool
值与NULL
进行比较,这是一个实现定义的空指针常量(不鼓励使用它,正如我们现在nullptr
的那样)。NULL
将转换为bool
(变为false
)。将此false
值与来自!ptr
的bool
进行比较。这种比较恰好做了预期的事情。
但是,据推测,比较不是这样打算的。
正确的版本可能是if (!(ptr==NULL))
.或者if (ptr!=NULL)
.或者你的简单版本,if (ptr)
.
请注意,比较是不必要的(因为delete
处理nullptr
指针),因此代码可以简单地:
delete ptr;
ptr = nullptr;
这是一个运算符优先级问题。
==
的优先级低于!
,所以你的条件被解析为(!ptr) == NULL
,而不是!(ptr == NULL)
。
这大致导致(ptr != NULL) == NULL
或!(ptr)
,这与你想要的完全相反。
相关文章:
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- 为共享 ptr 向量实现复制 c'tor?
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- C++中的指针否定 (!ptr == NULL)
- 遍历链表: while(ptr!=NULL) vs while(ptr->next!=NULL)?
- 插入无序映射将共享ptr变为null