0

var_ptr==NULL和有什么区别NULL==var_ptr?各种拱​​门是否有任何行为变化?

4

5 回答 5

2

这些是尤达条件,在这种情况下,除了选择特定的编码风格外,没有理由使用它们。

尤达条件

=正如 wiki 文章中所写,当使用赋值运算符而不是等于运算符时,将不需要的赋值报告为错误被认为是一个优点==

if (ptr = NULL) // valid code, may produce a warning on some compilers
if (NULL = ptr) // invalid, reported as error during compile time

尽管在我看来后者的可读性要差得多。

当像这样使用一种Yoda 条件(在 Java 或 C# 中)时,会有一个好处:

"constant string".equals(yourVariableString)

因为没有机会得到 NullPointerException

于 2013-06-26T14:38:06.493 回答
1

没有区别。这只是一种防止意外分配的方法。例如:

if (var = true); // I meant to compare, but this will still compile

相对于:

if (true = var); //  I meant to compare, but this WON'T compile
于 2013-06-26T14:36:51.643 回答
1

在编译器内部,您仍然会得到一条将指针值与常量值零进行比较的指令。这条指令,在大多数处理器中,仅以单一形式存在(尽管有时,有多种方法可以实现相同的事情,例如AND R0, R0is the same as CMP $0, R0(或者,在某些架构中,MOV var_ptr, R0将设置标志以便下一条指令可以是“如果不为零则跳转”) - 并且取决于哪种处理器架构,执行一个可能比另一个变体更快。但最终,它仍然相当于一个恒定零的比较。即使是最微不足道的编译器应该能够将这些变体中的任何一个优化为相同的东西,无论您选择使用“此变量是否为 NULL”的任何变体。(您遗漏了if (!var_ptr)在选择列表中——当然,有一些更复杂的方法可以达到相同的结果,我相信有这种心态的人可以想出一些复杂的东西,编译器会弄得一团糟)。

于 2013-06-26T14:51:22.617 回答
0

有些人更喜欢

NULL == var_ptr

选项,因为它可以防止意外“分配”错别字,例如

if (NULL = var_ptr) { ... }

当您分配给常量时,会引发语法错误。另一种方式,

if (var_ptr = NULL) { ... } 

在语法上是正确的,但几乎可以肯定不是你想要的。

于 2013-06-26T14:40:43.923 回答
0

为了检查是否有任何差异,我在 VS 2012 中编译了一个小片段,没有优化的调试模式

int * p = NULL;
if (p == NULL) p = NULL;
if (NULL == p) p = NULL;

x86

if (p == NULL)  -(disassembly)->    cmp dword ptr [p],0
if (NULL == p)  -(disassembly)->    cmp dword ptr [p],0

x64

if (p == NULL)  -(disassembly)->    cmp qword ptr [p],0
if (NULL == p)  -(disassembly)->    cmp qword ptr [p],0

编译器生成相同的代码,无论您是否拥有NULLp首先。因此,这只是风格问题以及为什么在左侧有非左值的问题?已经链接,以及直接引用 Yoda-Condition 的 wiki 帖子,它给出了一些提示,为什么最好不要将左值放在左侧。

于 2013-06-26T14:52:01.477 回答