if(NULL ==指针)和if(指针== NULL)之间有什么区别?

时间:2014-02-28 22:04:54

标签: c++ coding-style conditional-statements

使用之间有什么区别:

if (NULL == pointer) 

并使用:

if (pointer == NULL)    

我的教授说使用前者而不是后者,但我看不出两者之间的区别。

5 个答案:

答案 0 :(得分:15)

没有区别。你的教授更喜欢的是Yoda conditions,也见"Yoda Conditions", "Pokémon Exception Handling" and other programming classics

它应该在比较中防止错误地使用赋值(=)而不是平等(==),但是现代编译器现在应该警告这一点,所以这种类型的防御性编程应该不需要。例如:

if( pointer = NULL )
当程序员真正意思是:

时,

会将NULL分配给pointer

if( pointer == NULL )

应该是比较,哎呀。使用 Yoda条件 see it live )将此错误视为错误,并向此发出类似消息:

  

错误:表达式不可分配

正如jrok指出的那样:

if (!pointer)

在这种情况下一起避免这个问题。

这是一个具体的例子,说明为什么现代编译器我们不再需要这种技术了( see it live ):

#include <iostream>

int main()
{
    int *ptr1 = NULL ;

    if( ptr1 = NULL )
    {
            std::cout << "It is NULL" << std::endl ;
    }

}

请注意所有警告:

warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
    if( ptr1 = NULL )
        ~~~~~^~~~~~

note: place parentheses around the assignment to silence this warning
    if( ptr1 = NULL )
             ^
        (          )

use '==' to turn this assignment into an equality comparison
    if( ptr1 = NULL )
             ^
             ==

这使得很难错过这个问题。值得注意的是,在 C ++中 nullptr应优先于NULL,您可以查看What are the advantages of using nullptr?了解所有细节。

注意,在 C ++ 中,运算符重载的可能性很小,可能存在一些人为的不一样的情况。

注意,-Wparentheses warning在某些方面强制选择样式,您需要在生成警告的位置放弃对分配的潜在有效使用,例如,如果您使用-Werror或选择为这些案例加上括号,有些人可能会发现丑陋如下面的评论所暗示的那样。我们可以使用gccclang-Wno-parentheses中发出警告,但我不建议您选择,因为一般警告会指出真正的错误。

答案 1 :(得分:7)

编译器没有区别。唯一的小优点是,如果你忘记了一个“=”,第一个表单将导致语法错误(你不能将指针指定为NULL),而第二个表单可能没有给出任何警告并愉快地爆炸你的指针。

答案 2 :(得分:4)

它们都是相同的(它们都检查指针是否为0),不同之处在于,如果要防止意外分配,通常会使用第一个示例:

if (pointer = NULL) // This compiles, but probably not what you meant

if (NULL = pointer) // Syntax error!

答案 3 :(得分:2)

如果这门课程正在宣传 C ++ 11 兼容,那么真正应该使用的不是永远存在的NULL宏检查(至少在C语言生命周期中)。应该比较的是nullptr类型。供参考:nullptrWhat exactly is nullptr?

从上面引用的cplusplus.com页面,截至2014年2月28日:

  

空指针类型(C ++)空指针常量nullptr的类型。

     

这种类型只能取一个值:nullptr,转换为指针类型时会获取正确的空指针值。

     

即使nullptr_t它不是关键字,它也标识了一个不同的基本类型:nullptr的类型。因此,它作为一种不同的类型参与重载决策。

     

此类型仅为C ++定义(自C ++ 11起)。

C ++ 11(clang ++,C ++ Builder 64位(基于clang ++),Visual Studio 2010及更新版本的简短示例;也许只有64位,GCC 4.7.3可能,不确定,可能是GCC 4.8,......):

if (pointer == nullptr)

// this looks odd, but does compile
if (nullptr == pointer)

如果这是一个严格的C11课程,那么看起来没有改进的方法来替换NULL宏。 C99标准表示NULL宏可以可移植地表示为隐式或显式转换为void * type(from Wikipedia: Null pointer)的整数值零。据我所知,C11标准没有修改C99标准的这一方面。

答案 4 :(得分:0)

String pointer = "Some value";

最初pointer的值是"Some value",所以如果您错误地检查了它 if(pointer = NULL)代替if(pointer == NULL),空值将分配给pointer;但是在(NULL = pointer )的情况下,编译器永远不会允许您将任何内容分配给NULL。因此,请继续在条件语句中使用NULL == pointer