2009-10-26 133 views
11

比较运算符的顺序有差异吗?if(CONST ==变量)或if(变量== CONST)有什么区别?

#define CONST_VALUE 5 

int variable; 

... 

if (variable == CONST_VALUE) // Method 1 
... 

OR 

if (CONST_VALUE == variable) // Method 2 
... 

这是简单的偏好问题还是有一个特定的比较订单令人信服的理由?

+0

请参阅http://stackoverflow.com/questions/283205/what-was-the-most-dangerous-programming-mistake-you-have-made-in-c/283212#283212 – 2009-10-26 19:45:25

+0

相关:[https:///en.wikipedia.org/wiki/Yoda_conditions](https://en.wikipedia.org/wiki/Yoda_conditions) – Boann 2013-11-26 19:12:03

回答

31

有些人使用方法2的原因是,如果您错误地输入a =来代替==,那么您会得到编译器错误。然而,你会有人(像我一样)仍然会使用方法1,因为他们发现它更具可读性,如果出现错误,它将在测试过程中被检测到(或者在某些情况下,代码)。

+11

告诉我,你有没有犯过这样的错误,以这种方式编写它会陷入困境?我把它写成“方法1”,因为它更具可读性,并且我敢肯定,在编写C和C类语言的25年中,我从未*写过=而不是==。 – 2009-10-26 18:48:24

+5

它发生在我身上。考虑你自己的幸运。 – 2009-10-26 18:50:24

+3

@ Paul Tomblin:多年来至少有三次,我已经在if(或while)语句中进行了一项任务,并且在进行比较的时候已经确定了长期存在的错误。也就是说,我还应该指出,如果某个编译器(特别是gcc)包含* only *一个赋值(无比较),那么它会/将发出警告,除非包含在一组额外的括号内。尽管如此,首先保证与所有编译器一起工作。 – 2009-10-26 18:54:35

10

唯一的区别是,(CONST_VALUE ==变量)使得共用错字(CONST_VALUE =可变)不可能进行编译。

相比之下,如果(变量= CONST_VALUE)将导致编译器想你的意思是分配给CONST_VALUE“变量”。

的=/==混乱是错误的在C很常见的来源,这就是为什么人们都试图解决这个问题用编码约定。

当然,如果您比较两个变量,这并不会节省您的时间。

而且这个问题似乎是How to check for equals? (0 == i) or (i == 0)

重复,这里的一些详细信息:http://cwe.mitre.org/data/definitions/481.html

3

正如其他人所提到的,CONST_VALUE ==变量避免错字=。

我还是做了“可变== CONST_VALUE”,因为我觉得它更具可读性,当我看到这样的:

if(false == somevariable) 

我的血压上升。

+3

我确实使用了'if(CONST_VALUE == variable )',但是如果我看到'if(false == somevariable)',我的血压也会受到影响。 (这是因为这当然应该是'if(!somevariable)'。) – sbi 2009-10-26 18:49:44

+1

+1 for pressurepressure – GManNickG 2009-10-26 18:56:54

2

的第一变型

if (variable == CONST_VALUE) 

是较好的,因为它是更具有可读性。它遵循变化最大的价值第一的约定(也用于数学)。

第二个变量

if (CONST_VALUE == variable) 

被一些人以防止平等与分配

if (CONST_VALUE = variable) 

有更好的方法来实现,例如启用和采取谨慎检查的mixup的编译器警告。

1

其他人已经指出了原因。 =/==混乱。我更喜欢第一个版本,因为它更接近思考过程。一些编译器缓解混乱=和==给予警告,当它遇到类似

if(a=b) 

在这种情况下,如果你真正想做的事你不得不写分配

if((a=b)) 

我会这样写

if((a=b) != 0) 

为了避免混淆。

这就是说,我们在我们的代码中有1个案例,其中我们有一个=/==混淆,反过来写它不会有帮助,因为它是增值税之间的比较。

+0

在GCC中,该选项是-Wparentheses – Adisak 2009-10-27 01:37:13