在浏览 MSDN 网站时,我发现很多地方都使用了(NULL == bCondition)这样的条件检查方式。使用这种方式的目的是什么?能否提供一些示例来解释一下?
谢谢。
谢谢。
NULL == condition
的使用在发生打字错误时提供了更有用的行为,当赋值运算符 =
被意外地使用而非比较运算符 ==
时。
if (bCondition = NULL) // typo here
{
// code never executes
}
if (NULL = bCondition) // error -> compiler complains
{
// ...
}
在前一种情况下,C编译器会发出警告,而许多语言中则没有此类警告。
=
还是 ==
? - Oscar Mederos这被称为Yoda Conditions(Yoda 表达式)。 (原链接,需要高声望才能查看)。
它旨在防止在条件语句中意图使用相等比较符号==
而错误地使用赋值符号=
。如果你习惯于使用 Yoda 表达式并且因笔误而写成=
而不是==
,那么代码将无法编译,因为你不能将 rvalue 赋值。
这是否值得这种尴尬?有人持反对意见,认为编译器在发现条件表达式中出现=
时会发出警告。我认为,在我的一生中只有两三次犯这个错误,这并不足以证明我要改变我写过的所有 MLOCs 的约定。
因此,写(NULL == bCondition)与相反的做法并没有更好或更差的实践方法,除非您的编译器非常古老。您不需要费心以任何特定顺序编写它们。
您应该关注的是,采用一种编码风格,在if/loop条件内永远不要编写赋值语句。没有理由这样做。这是C语言完全多余、有风险和丑陋的特性。所有行业事实上的编码标准都禁止在条件中进行赋值操作。
参考文献:
bCondition == NULL
bCondition = NULL // the value will be assigned here.
在某些情况下,
NULL = bCondition // there will be an error
这只是一个良好的防御措施。有些人可能会觉得这更方便阅读。如果在分配时出现打字错误而不是使用相等运算符,编译器将尝试修改NULL
,它不是一个左值并且会产生一个错误消息。当使用bCondition = NULL
时,编译器可能会产生一个关于使用分配作为真值的警告信息,这个消息可能会被忽略。
variable == value
和value == variable
之间没有区别,原则上也不应该有区别,但在C++中,如果涉及运算符重载,通常情况下会有区别。例如,虽然预计==
是对称的,但某些人可能会编写一个不对称的病态实现。_bstr_t
字符串类在其operator==
实现中存在不对称问题。