2011-05-02 166 views
13

在探索msdn网站时,他们使用的大部分条件检查位置(NULL == bCondition)。这些(bCondition == NULL)和(NULL == bCondition)之间有什么区别?

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

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

谢谢。

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

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

C语言编译器给出警告在前者:

+12

另一个问题很多,其中karthik/user692270接受@karthik的答案。停止这种虚假的upvote农业。 – 2011-09-27 07:24:05

回答

26

采用NULL == condition在一个错字的情况下,当赋值运算符=被意外使用,而然后比较运算符==提供了更多的有用的行为情况下,许多语言都没有这样的警告。

+0

他在说'='还是'=='? – 2011-05-02 07:04:45

+0

我觉得他问的是'=='? – Jess 2011-05-02 07:05:59

+1

@Jess:主要目的是,如果有人忘记放置赋值运算符而不是比较运算符,则会抛出error.thats为什么在msdn站点中他们正在使用像这样的比较NULL == bCondition – karthik 2011-05-02 07:08:23

8

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

因为错字它发生的,而不是写

bCondition == NULL 

他们写出来

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

在案件

NULL = bCondition // there will be an error 
4

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

+0

也许你拼错了术语'lvalue'和'rvalue'? – beduin 2011-05-02 07:08:54

+6

我们有些人认为阅读起来很不方便。至少这显然会让人们问为什么有人会这样做! :-) – 2011-05-02 07:12:26

+0

@beduin:是的,谢谢你的注意。 – 2011-05-02 07:32:08

10

它叫做Yoda Conditions。 (original link,你需要高级代表才能看到它)。

这是为了防止意外分配=在意向相等比较==的条件。如果你习惯性地坚持尤达,并通过编写=而不是==来造成拼写错误,则代码将无法编译,因为您无法分配给右值。

它值得尴尬吗?有人不同意,说当编译器在条件表达式中看到=时会发出警告。我说,在我一生中只发生过两三次这样的错误,这并不能证明我改变了我在这次大会上写的所有MLOC。

+1

+1太糟糕了,现在链接已经死了。 – Flavius 2012-02-22 04:21:59

+6

@Flavius:不完全死了,你只需要足够的代表来看看它。我无法得到SO上的版主的趋势来删除所有内容。它至少可以迁移到程序员SE。 – ybungalobill 2012-02-22 08:52:00

+1

现在有一个[WiKi页面](http://en.wikipedia.org/wiki/Yoda_conditions)WiKi页面。 – 2014-07-17 14:08:03

8

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

从1990年发布的Borland Turbo C转发,当你设法输出这个bug时,每个已知的编译器都会警告“可能不正确的赋值”。所以写(NULL == bCondition)不是比相反的更好或更差的练习,除非你的编译器是非常古老的。你不需要为写任何特定的顺序而烦心。

什么你应该打扰用,是适应一种编码风格,你从未写作业内如果/循环条件。没有理由这样做。这是C语言的一个完全多余,风险和丑陋的特征。所有行业事实上的编码标准禁止在条件内分配。

参考文献:

  • MISRA C:2004年13.1
  • CERT C EXP18-C
+0

MSVC至少在默认情况下不会警告您对这个错误。 – shebaw 2011-05-06 15:18:52

+2

@shebaw令人印象深刻的是,他们设法编译出比1991年的TC差的编译器。获得一个新的编译器。 – Lundin 2011-05-08 16:54:25

+2

+1为最佳答案。我厌恶尤达风格。有很多更好的方法可以避免语言中的这个缺陷,而不是向后写。 – 2011-07-26 13:39:05

1

虽然通常variable == valuevalue == variable没有区别,而在原则上不该”在C++中,如果涉及操作符重载,那么通常情况下可能会有所不同。例如,虽然==预计是对称的,但有人可能会写出一个不是的病理实现。

微软的_bstr_t字符串类在其operator==实现中遇到了不对称问题。

+0

有不对称的有效案例。例如,当实现一个智能指针时,在原始指针作为参数的类中使用==操作符是非常合理的。在这种情况下,恢复订单将导致编译错误。 – SomeWittyUsername 2016-07-22 08:19:00