2011-07-26 46 views
10

可能重复:
What is the difference between these (bCondition == NULL) and (NULL==bCondition)?C++中NULL!= value的含义是什么?

我正在经历一段C++代码,并遇到了类似的代码

if (NULL != threadInfo) 
{ 
    ... 
    ... 
} 

我只是想知道有什么区别在使用表达式之间

if (threadInfo != NULL) 
{ 
    ... 
    ... 
} 

上面说了什么。 读取第一个读取“如果NULL不等于ThreadInfo”,第二个读取“如果threadInfo不等于NULL”。对我来说,第二个更有意义。

+1

当您尝试此操作时,您发现了哪些差异? – marto

+4

你会在c/C++中看到很多'if(Constant == variable)',因为如果你离开second = off,试图分配一个常量左手表达式,你会得到一个编译错误。也许类似的东西? – asawyer

+0

它没有什么区别,它只是一个等式,你应该更多地将它看作只有2个值('if(true == true)')而不是变量和值。 – Sander

回答

14

不,没有区别。在==的情况下可能会有所不同。问题是,如果你不小心写了=而不是==,编译器会在第一种情况下给出错误。

if (threadInfo = NULL) //always false. The compiler will give you a warning at best 

if (NULL = threadInfo) //Compiler error 

我个人讨厌这种做法,并认为这是更好地编写能够在正常的人类语言,而不是尤达语言读取的代码。

+6

+1,绝对不可读,绝对没有任何收益。如果您经常输入'='而不是'==',并且还有*什么都没有*以提醒您,那么您可能会遇到更大的问题。 – rid

+1

该警告是无用的,因为模板代码会产生大量的误报。 –

2

没有区别。编写NULL != ...的要点是,如果您改为输入错字并编写NULL = ...,代码将无法编译。如果你有... = NULL它可能是一个有效的任务和错误可能不被注意(但大多数编译器检测到这一点,并警告你)。有人曾试图insert a backdoor into the Linux kernel using this technique

另请注意,大多数人不会这样编码。

0

这通常用作约定,本身没有明显的含义。

因为分配发生在lvals上,并且NULL是不可分配的,所以当您的意思是threadInfo == NULLthreadInfo != NULL错误时,这可以防止可怕的threadInfo = NULL

有关更多详细信息,请参阅this wikipedia article section on left-hand comparisons

2

没有区别,只是第一个选项不能被误输入为:

if (threadInfo = NULL) 
{ 
    ... 
    ... 
} 

而且有些人不知道如何使用编译器开关检查这个(和一些编译器没有它们)。

4

如果threadInfo是一种重写operator !=的类型,并且该类的所有者尚未提供处理交换两个参数的情况的对称自由函数,则可能存在差异(可能还需要以解雇该程序员)。

否则,这是一个品味问题。可能会写if(42 == answer)而不是if(answer == 42)的人会喜欢 - 这样可以保护您免于错误地使用赋值运算符而不使用等号检查。但是,由于现代编译器在你这样做的时候会提醒你,所以这个方法是否提供了什么是值得商榷的。

+0

但区别在于'NULL!= threadInfo'不会编译,因为int没有针对threadInfo类型的运算符!=。如果threadInfo是一个指针类型,我不认为会有区别吗? –

+0

@Douglas:可能有一个自由函数'operator!=(int,threadInfo_TYPE)'定义在与'threadInfo_TYPE'相同的名字空间中,在这种情况下,由于Koenig Lookup的原因它会被自动考虑。 – Jon

7

这是一种安全,所以你不小心写的

threadInfo = NULL 

代替

threadInfo == NULL 

对于!=有没有必要做这个,但它是一致的。

+5

转。编译器。警告。上。 :| – GManNickG

+1

我确实有我的编译器警告。但是,我确实很喜欢知道背后的原因,而不是仅仅因为其他人正在做这件事而做这件事。我只是说明了原因 - 这是一个有效的原因 - 我没有说你不应该有警告...... –

0

两者都做同样的事情。这是一个风格约定用于避免输入错误为:

if (value=NULL) // assignment instead of == operator 
{ 
} 
1

没有区别,这就是所谓的Yoda编码约定。

if (NULL != threadInfo) 

相当于

if (threadInfo != NULL) 

if (threadInfo) 
0

这些是在逻辑上完全相等。

第二个更直观,当看到第一个被认为更安全,因为它不允许错误地编写(threadInfo = NULL),导致错误。

0

Null是内存中的引用,只包含任何内容,没有任何地址可以访问它。

通过这样做,您可以在null后面进行比较以检查某个对象是否有值或无值。

0

我没有看到任何区别。但是,如果您忘记输入第二个=,那么编写NULL == someVar的做法可以使您免于编写NULL = someVar

相关问题