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

kar*_*hik 15 c c++ syntax if-statement

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

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

请提供一些样品来解释这些.

谢谢.

kar*_*hik 29

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

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

if (NULL = bCondition) //  error -> compiler complains
{
 // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 许多地方的另一个问题是[karthik](http://stackoverflow.com/users/644073/karthik)或[user692270](http://stackoverflow.com/users/692270/user692270)接受@karthik的回答.停止这种伪造的投票农业. (6认同)

ybu*_*ill 13

它被称为尤达条件.(原始链接,你需要高代表才能看到它).

这意味着===意图进行相等比较的条件下防止意外分配.如果你习惯性地坚持Yoda并通过写=而不是编写拼写错误==,代码将无法编译,因为你无法分配给rvalue.

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

  • @Flavius:不完全死了,你只需要足够的代表来看它.我无法在SO上得到主持人的趋势来删除所有内容.它至少可以迁移到程序员SE. (6认同)

Tus*_*har 8

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

因为拼写错误而不是写作

bCondition == NULL 
Run Code Online (Sandbox Code Playgroud)

他们最终写作

bCondition = NULL // the value will be assigned here.
Run Code Online (Sandbox Code Playgroud)

的情况下

NULL = bCondition // there will be an error
Run Code Online (Sandbox Code Playgroud)


Lun*_*din 8

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

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

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

应该打扰的是,在if/loop条件下,如果您从未在内部编写赋值,则调整编码样式.没有理由这样做.这是C语言的一个完全多余,冒险和丑陋的特性.所有行业事实上的编码标准都禁止在内部条件下进行分配.

参考文献:

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

  • @shebaw令人印象深刻的是,他们设法使编译器比1991年的TC更差.获得一个新的编译器. (2认同)
  • +1为最佳答案.我讨厌尤达风格.有许多更好的方法来避免语言中的这种缺陷,而不是向后编写它. (2认同)