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条件。有经验的程序员使用现代编译器,当他们省略
=
时会发出警告。我讨厌错误警告!啊!由于愚蠢/愚蠢的原因,它经常破坏我的代码。当然,拥有编译时没有任何警告的代码是可取的,但不是必需的。我应该更好地了解代码应该是什么样子,以及我可以接受的警告,而不是