关于null值比较

一 null值比较场景

对于C/C++或者java中对于null值的比较,有的时候直接使用if(!p)有的时候使用if(p == null),可能有的编程规范中要求null值在前面if(null == p),那么我们日常使用中该如何使用呢? 有没有一个统一的标准。
C语言中对null的比较,以linux kernel中的代码为例,使用的是if( p == NULL) 判断

static inline int nf_bridge_get_physinif(const struct sk_buff *skb)
{
    struct nf_bridge_info *nf_bridge;

    if (skb->nf_bridge == NULL)
        return 0;

C++中对null指针的比较,以android中c++的工程代码为例,if(!p)和 if( p == nullptr) 都有使用,这里有一点要指出的是,c++使用的是nullptr而不是NULL

Return Health::update() {
    if (!healthd_mode_ops || !healthd_mode_ops->battery_update) {
        LOG(WARNING) << "[email protected]: update: not initialized. "
                     << "update() should not be called in charger / recovery.";
        return Result::UNKNOWN;
    }
Return Health::debug(const hidl_handle& handle, const hidl_vec&) {
    if (handle != nullptr && handle->numFds >= 1) {
        int fd = handle->data[0];
        battery_monitor_->dumpState(fd);

Java语言中null的比较,也是if (obj != null)的方式:

    @Override
    public ArrayList buildTouchDispatchChildList() {
        mTouchDispatchList.ensureCapacity(3);
        if (mCaption != null) {
            mTouchDispatchList.add(mCaption);
        }
        if (mContent != null) {
            mTouchDispatchList.add(mContent);
        }
        return mTouchDispatchList;
    }

二 分析

在C语言中关于NULL的定义

 define NULL ((void*)0)

在C++语言中空指针使用的是nullptr而不是NULL,是因为NULL在C++中被定义成0,而nullptr才是给指针使用的。

#define NULL 0

由于JAVA中,除了立即数,其他都是对象,因此使用if(obj == null)进行比较。
可能每个公司的编程规范要求null值在前,避免赋值操作,相关bug不好查找,对于java来说这方面不用考虑,因为

if (o = null)

上面这种压根就编译不过,因为if判断的是boolean类型,唯一需要考虑的是下面这种情况

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality

像上面这种的话,直接判断x值即可

三 总结

1 对于java语言,除非编程规范限制,使用if (obj == null)判断即可,没有风险
2 由于C语言没有boolean类型,因此对于空指针判断使用if(!p)比较好一点。如果使用NULL的话,编程规范有特殊要求的话,比如要在左边if(NULL == p)那就按照编程规范书写。

你可能感兴趣的:(关于null值比较)