C++ 为什么一些有经验的程序员会编写与变量前的值的比较?

C++ 为什么一些有经验的程序员会编写与变量前的值的比较?,c++,c,coding-style,C++,C,Coding Style,可能的重复项: 我一直在看一个奇怪的教程,在这里和那里,以及一些DirectX代码,注意到许多有经验的C++程序员用以下方式编写表达式: (<constant> == <variable>) (==) 而不是我的传统智慧似乎更喜欢: (<variable> == <constant>) (==) 例如,if(NULL==ptr)而不是if(ptr==NULL)。我更喜欢第二种选择,如果没有其他理由选择前者,我的理由是变量似乎是表达式的“

可能的重复项:

我一直在看一个奇怪的教程,在这里和那里,以及一些DirectX代码,注意到许多有经验的C++程序员用以下方式编写表达式:

(<constant> == <variable>)
(==)
而不是我的传统智慧似乎更喜欢:

(<variable> == <constant>)
(==)
例如,
if(NULL==ptr)
而不是
if(ptr==NULL)
。我更喜欢第二种选择,如果没有其他理由选择前者,我的理由是变量似乎是表达式的“接收”端


但我怀疑前者是用来避免无意中通过使用
=
而不是
=
将常量的值赋给变量的。这是正确的吗?

它避免了编写
var=NULL
。写入
NULL=var
将产生错误。所以你是对的:-)

是的,没错。这是为了检测
=
而不是
=

的打字错误,因为你不能给常数赋值,所以如果你错把
=
放在
=
而不是
=
上,编译器会抛出一个错误,提醒你以前是这样的,是的。当然,现在几乎所有的编译器都会在
if()
条件下对赋值发出警告,因此只有那些经常抑制警告的人才有好处。

这是一个常见的理由,因为你不想用冗长的表达式将常量推到屏幕的最右边。后一种观点对我来说从来都不是特别有说服力,而前一种观点现在也不是很有效,因为任何有自尊心的编译器都会发出警告(你确实会将警告作为错误进行编译,不是吗?:-)

编辑:我刚刚看到了新的Xcode4预览版,看看他们选择的示例来演示他们新的“修复”功能



(来源:)

来捕捉赋值和比较之间的差异

如果你的意思是:

if (ptr == foo)
但是类型

if (ptr = foo)
if仍然是有效代码,因为
ptr=foo
设置为
foo
的值后,将在
ptr
上进行布尔检查。显然,你不想要这个


然而,我发现它对可读性有很大的伤害,并且考虑到大多数IDE和预处理器无论如何都会捕捉到这一点,所以永远不要使用这种风格。

作为java开发人员,我倾向于编写如下表达式:

   //primitive check
   if(constant == variable)

   //Object check
   if(constant.equals(variable))

这对于对象尤其重要,因为如果变量为null,表达式不会出错。如果表达式的顺序不同,则null变量将出错。我保持一致性,并对原语执行相同的顺序。

查看此问题的最高评分答案

他们把这种编码风格称为“尤达条件”。

这被称为“尤达条件”

看这里

我很喜欢这个词,因为:

if(Light::On == light)
全文如下:

“如果灯亮了”


如上所述,这是用来防止错误的分配。可以说,这种做法是基于现代IDE的古老的,但我仍然认为这是一个很好的实践。

< P>捕获是使用YODA条件的一个主要原因,但是还有其他一些:在C++中,操作符在LHS操作数上被调用。由于常数通常是常量(duh),或原语,这限制了非感官操作的可能性。一个例子是原始文本上的
=
,例如给定的公共原因(
1=a
),但这将包括
运算符=()const
,或用于非POD类型的任何运算符。

使用VB 6.0之类的语言,该语言没有明确的赋值和比较运算符

a=2

'将编译,无论您是指a被分配为2还是将a与2进行比较 如果您的意思是比较,则可能会出现运行时错误

“如果你总是写作业

a=2

“如果你总是写信,那就交作业吧

2=a

'您消除了编译成功和运行时错误场景

但是,这只是提示:当您有一个类似

a=b'比较还是赋值

C#有: -不同的赋值(=)和比较(=)符号 -比较必须用括号括起来


那么这就不是问题了。

你说得对-如果你把“==”误输入为“=”,就会触发编译器错误,因为赋值总是返回true。虽然这通常很容易发现和调试,但偶尔会变成一个很难检测到的bug,请考虑以下事项:

#define OK 2 // Or something...
[...]
while(status = OK){
    // This loop will never end
    // Even if you change the value of status within it
    [...]
}
这可能是一个令人讨厌的bug,特别是当属于违规语句的块很长时(想象一下寻找状态始终保持正常的所有可能原因)

另一方面,如果您使用:

while(OK = status){
这将引发一个编译器错误,因为您无法为常量赋值


这种做法有时被称为尤达条件,因为它将对象和主体并置。就像“如果状态不错”与“如果是OK状态”和“天空是蓝色的”和“蓝色是天空”一样的,后者是尤达可能会说的。< / P>是的,正确地在这个代码中圣战项目最常与C++编码相关。@马克:现在打击每个使用错误命令的人!(提示:真正的程序员永远不会把=for==…!)真正的程序员(TM)使用一种布尔类型的语言…它被称为yoda条件。有经验的程序员使用现代编译器,当他们省略
=
时会发出警告。我讨厌错误警告!啊!由于愚蠢/愚蠢的原因,它经常破坏我的代码。当然,拥有编译时没有任何警告的代码是可取的,但不是必需的。我应该更好地了解代码应该是什么样子,以及我可以接受的警告,而不是