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

tyu*_*980 8 c++ coding-style conditional-statements

使用有什么区别:

if (NULL == pointer) 
Run Code Online (Sandbox Code Playgroud)

和使用:

if (pointer == NULL)    
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 15

没有区别.你的教授更喜欢的是Yoda条件,也可以看到"尤达条件","神奇宝贝异常处理"和其他编程经典.

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

if( pointer = NULL )
Run Code Online (Sandbox Code Playgroud)

将分配NULLpointer程序员真正意味着什么:

if( pointer == NULL )
Run Code Online (Sandbox Code Playgroud)

它应该是一个比较,哎呀.使用Yoda条件设为错误(请参见实时),并向此发出类似消息:

错误:表达式不可分配

正如jrok指出的那样:

if (!pointer)
Run Code Online (Sandbox Code Playgroud)

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

这是一个具体的例子,为什么现代编译器我们不再需要这种技术了(现场观看):

#include <iostream>

int main()
{
    int *ptr1 = NULL ;

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

}
Run Code Online (Sandbox Code Playgroud)

请注意所有警告:

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 )
             ^
             ==
Run Code Online (Sandbox Code Playgroud)

这让人很难错过这个问题.值得注意的是,在C++中, nullptr应该是首选NULL,你可以看一下使用nullptr有什么好处?了解所有细节.

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

注意,-Wparentheses警告在某些方面强制选择样式,您需要在生成警告的位置放弃对赋值的潜在有效使用,例如,如果您使用-Werror或选择对这些情况进行括号化,有些可能会发现丑陋如下面的评论所示.我们可以在打开的警告gccclang使用-Wno-parentheses,但我不会建议的选择,因为在一般的警告将显示一个真正的错误.

  • +1因为我教你的Yoda条件. (3认同)

LSe*_*rni 7

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