if(!node)与if(node == nullptr)是否存在差异?
判断
if(!node)与if(node == nullptr)是否等价 原生指针类型场景:完全等价
如果node是C++内置的原生指针(比如int*、MyClass*这类),那if(!node)和if(node == nullptr)的逻辑完全一致,没有任何差异。
原因很直接:
!node是把指针转换成布尔值——空指针(包括nullptr)转成false,取反后为true;非空指针转成true,取反后为false。node == nullptr是直接比较指针和空指针常量nullptr,结果也是布尔值,逻辑和前者完全对应。
重载了运算符的类类型场景:可能不等价
如果node是某个自定义类的对象(比如智能指针类或者其他重载了运算符的类型),那两者是否等价完全看类的运算符重载实现:
- 要是类只重载了
operator!()但没重载operator==(std::nullptr_t),那node == nullptr会编译失败,但!node能正常使用。 - 要是类只重载了
operator==(std::nullptr_t)但没重载operator!(),那!node会编译失败,node == nullptr能正常使用。 - 最关键的是,如果两者都重载了,但实现逻辑不一样(比如故意把
operator!()的返回值写反),那两者的行为会完全不同。
举个直观的例子:
class WonkyPtr { private: int* raw_ptr; public: WonkyPtr(int* p = nullptr) : raw_ptr(p) {} // 重载!,故意返回和"是否为空"相反的逻辑 bool operator!() const { return raw_ptr != nullptr; } // 重载==,正常判断是否等于nullptr bool operator==(std::nullptr_t) const { return raw_ptr == nullptr; } }; int main() { WonkyPtr empty_ptr; // 内部是nullptr if(!empty_ptr) { // 这里operator!返回false,不会进入分支 // 不会执行到这 } if(empty_ptr == nullptr) { // 返回true,会进入分支 // 会执行到这 } return 0; }
这个例子里,两个判断的结果完全相反,显然不等价。
补充:为什么node == NULL和node == nullptr不等价
NULL在C++里一般被定义为0或者(void*)0,如果node是重载了operator==(int)的类对象,node == NULL会匹配到这个int版本的重载;而node == nullptr只会匹配operator==(std::nullptr_t)(如果类提供了的话),这就导致两者的行为可能完全不同。
内容的提问来源于stack exchange,提问作者akvn
相关产品推荐
相关产品推荐

