为什么一些有经验的程序员会在变量之前写出比较值?

可能重复:
如何检查等于? (0 == i)或(i == 0)
为什么在C#中经常会看到“null!= variable”而不是“variable!= null”?

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

( == ) 

而不是我的传统智慧似乎更喜欢:

 ( == ) 

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

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

对,那是正确的。 这是检测=而不是==的错字。

过去就是这种情况,是的。 当然,现在几乎所有的编译器都警告if()条件下的赋值,所以优势只适用于经常抑制警告的人。

因为你不能给一个常量赋值,所以如果错误地你把=而不是==编译器抛出一个错误,提醒你

这被称为“Yoda Conditional”!

请参见https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

我非常喜欢这个词,因为:

 if(Light::On == light) 

读作:

“如果亮了”

如前所述,这用于防止错误分配。 可以说这种做法是基于现代IDE的陈旧,但我仍然认为这是一种很好的做法。

这是一个常见的理由,因为你不想用一个冗长的表达式将常量推到屏幕的最右边。 后一种说法对我来说从未听起来特别有说服力,前者现在并不是真正有效,因为任何自尊的编译器都会发出警告(你会编译警告 – 错误,不是吗?:-) 。

编辑:我刚刚看到了新的Xcode 4预览,只看他们选择的例子来举例说明他们的新“Fix-it”function!

alt text http://devimages.apple.com/technologies/tools/images/new_autocorrect20100721.jpg

捕捉分配和比较之间的差异。

如果你的意思是:

 if (ptr == foo) 

但是输入

 if (ptr = foo) 

如果仍然是有效的代码,因为ptr = foo将其设置为foo的值后将评估为对ptr的布尔检查。 显然,你不想要这个。

但是,我发现它大大损害了可读性,并且鉴于大多数IDE和预处理器无论如何都会捕获它,所以永远不要使用这种风格。

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

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

https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

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

捕获赋值是使用Yoda条件的主要原因,但还有其他一些:在C ++中,在LHS操作数上调用运算符。 由于常数通常是const (duh)或基元,这限制了非感知操作的可能性。 一个例子是=在原始文字上,例如给定的常见原因( 1 = a ),但这将包括operator=() const ,或者用于非POD类型的任何运算符。

使用VB 6.0这样的语言,它没有明确的赋值和比较运算符,

a = 2

‘将编译,无论你是指一个被分配2还是你正在比较一个2如果你的意思是比较,有可能发生运行时错误。

‘如果你总是写作的作业

a = 2

‘如果你总是写作,那就是作业

2 = a

‘您消除了编译成功和运行时错误的情况。

但是,这只是一个提示:当你有一个表达式时,视觉提示是不可用的

a = b’比较或分配?

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

那么这就成了一个问题。

因为他们知道他们在做什么:P

你是对的 – 如果你将“==”错误地改为“=”就会触发编译器错误,因为赋值总是返回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 [...] } 

这可能是一个令人讨厌的错误,特别是如果属于违规语句的块很长(想象一下寻找状态始终保持正常的所有可能原因)。

另一方面,如果您使用:

 while(OK = status){ 

这会抛出编译器错误,因为您无法为常量赋值。

这种做法有时被称为尤达条件,因为它并置了对象和主题。 比如“如果状态正常”vs“如果状态良好”和“天空是蓝色的”与“蓝色是天空” – 后者是尤达可能会说的话。

作为一名java开发人员,我倾向于编写这样的表达式:

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

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