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

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

    @Override
    public ArrayList<View> 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)那就按照编程规范书写。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,771评论 0 6
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 6,148评论 0 12
  • 高中同学阿香小孩儿都一岁多了。同岁的人哪。不知不觉已经28岁了。
    隔天相望害相思阅读 2,972评论 0 0
  • 诗音雅韵 诗书万卷气自华, 音落珠贝映晚沙, 雅亭浅墨抒川海, 韵起应如沸中茶。
    流年_逝水阅读 2,732评论 2 2

友情链接更多精彩内容