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总觉得怪怪的。

    三、结论

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

  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/dashumeizi/p/4501351.html
Copyright © 2011-2022 走看看