使用之间有什么区别:
if (NULL == pointer)
并使用:
if (pointer == NULL)
我的教授说使用前者而不是后者,但我看不出两者之间的区别。
答案 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
或选择为这些案例加上括号,有些人可能会发现丑陋如下面的评论所暗示的那样。我们可以使用gcc
在clang
和-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类型。供参考:nullptr和What 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
。