You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:52:50