这些(bCondition == NULL)和(NULL == bCondition)有什么区别?

时间:2011-05-02 06:57:53

标签: c++ c syntax if-statement

在探索msdn网站时,他们正在使用大多数条件检查位置(NULL == bCondition)。

使用这些符号的目的是什么?

请提供一些样本来解释这些。

感谢。

6 个答案:

答案 0 :(得分:29)

使用NULL == condition在拼写错误的情况下提供更有用的行为,当意外使用赋值运算符=而不是比较运算符==时:

if (bCondition = NULL)  // typo here
{
 // code never executes
}

if (NULL = bCondition) //  error -> compiler complains
{
 // ...
}

C编译器在前一种情况下发出警告,在许多语言中都没有这样的警告。

答案 1 :(得分:12)

它被称为Yoda Conditions。 (original link,您需要高代表才能看到它。)

这意味着在意图进行相等比较=的情况下防止意外分配==。如果你习惯性地坚持Yoda并通过编写=而不是==来输入拼写错误,代码将无法编译,因为你无法分配到右值。

值得尴尬吗?有些人不同意,他们说编译器在条件表达式中看到=时会发出警告。我说在我的一生中只发生了两三次这样的错误,这并不能证明我将生命中所写的所有MLOC都改为这个惯例。

答案 2 :(得分:8)

许多人更喜欢编写NULL == bCondition,以便他们意外地不将NULL值赋给bCondition。

因为拼写错误而不是写

bCondition == NULL 

他们最终写作

bCondition = NULL // the value will be assigned here.

如果是

NULL = bCondition // there will be an error

答案 3 :(得分:8)

没有区别。这是一种古老的防御性编程方式,已经淘汰了20多年。目的是在比较两个值时防止意外键入=而不是==。迁移到C的Pascal程序员特别容易写这个错误。

从1990年发布的Borland Turbo C开始,当你设法输入这个bug时,每个已知的编译器都会警告“可能不正确的分配”。

所以写作(NULL == bCondition)并不比相反的更好或更差,除非你的编译器非常古老。您无需为任何特定顺序编写它们而烦恼。

没有理由这样做。这是C语言的一个完全多余,冒险和丑陋的特性。所有行业事实上的编码标准都禁止在内部条件下进行分配。

参考文献:

  • MISRA C:2004 13.1
  • CERT C EXP18-C

答案 4 :(得分:4)

这只是一个很好的防御措施。有些人也可能觉得阅读起来更方便。如果错误的赋值而不是相等运算符,编译器将尝试修改NULL,这不是左值并将产生错误消息。使用bCondition = NULL时,编译器可能会产生一个关于将赋值用作真值的警告,这个消息可能会丢失并且不会引起注意。

答案 5 :(得分:1)

虽然通常是variable == valuevalue == variable之间没有区别,原则上不应该有,在C ++中有时可能会有区别如果涉及运算符重载。例如,虽然==预计是对称的,但是有人可能会编写一个不是的病态实现。

Microsoft的_bstr_t字符串类在其operator==实现中存在不对称问题。