zoukankan      html  css  js  c++  java
  • 判断指针是否为空

    这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设p为指针):

    if (NULL == p) {
        // ...
    }
    if (!p) {
    }

    到底哪种方式好呢?这个问题应该从两个方面去考虑,本文就是围绕这两个问题展开的,仅限于C语言。 
    它们在语义、编译等环节上是否等价? 
    它们在可读性、可维护性等上面是否等价?

    一、是否存在隐式类型转换?

    《C 程序设计语言中》规定(中文第二版177页),对于运算符==和!=,可以作如下比较:指针可以和值为0的常量表达式或指向void的指针进行比较。而NULL在C中被定义为((void*)0),故NULL == p可以直接进行。

    而175页也同时规定,运算符!的运算分量必须是一个算术类型或指针。如果运算分量等于0,那么结果为1,否则结果为0。结果类型为int。

    由上面的分析可以看出,上述两个条件判断都不需要进行隐式类型转换。同时,我也在VC2008下面测试了一下,这两种情况下的汇编都为如下形式:

       1: 00971578  cmp         dword ptr [p],0 
       2: 0097157C  jne         test1+0A3h (971583h) 

    更深一步的讲,C99规范对运算符==和!也是有规定的,和《C 程序设计语言中》描述一致。第6.3.5节,第5点明确表示!E和0==E等价。参见下面的具体描述: 
    5 The result of the logical negation operator ! is 0 if the value of its operand compares 
    unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. 
    The expression !E is equivalent to (0==E).

    第6.5.9节中规定==两边的操作数,可以一边是指针,一边是指向void类型的指针;或者,一边是指针一边是空指针常量。参见下面的具体描述: 
    — one operand is a pointer to an object or incomplete type and the other is a pointer to a 
    qualified or unqualified version of void; or 
    — one operand is a pointer and the other is a null pointer constant.

    二、可读性

    《C 程序设计语言中》中文第二版32-33页讲到运算符!时,建议使用!p而不要使用p == 0。但同时又提到在复杂的情况下可能难于理解。个人认为,!p的方式可以使代码更短,看起来简洁,NULL == p总觉得怪怪的。

    三、结论

    通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。

  • 相关阅读:
    MySql行锁等待时间
    日志工具类-Mapper静态调用
    MySql锁机制理解记录
    Flink之TableAPI和SQL(5):表的时间特性
    Flink之TableAPI和SQL(4):表的Sink实现
    Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)
    Flink之TableAPI和SQL(2):表和外部系统的连接方式
    Flink之TableAPI和SQL(1):基本功能描述
    sb 错误
    洛谷 P6189
  • 原文地址:https://www.cnblogs.com/dashumeizi/p/4501351.html
Copyright © 2011-2022 走看看