if(CONST==variable)和if(variable==CONST)有什么区别?(涉及IT技术)

11

比较运算符的顺序有区别吗?

#define CONST_VALUE 5

int variable;

...

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

OR

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

这只是一种偏好还是有某种比较顺序的强制性原因?


请参见以下链接:https://dev59.com/90XRa4cB1Zd3GeqPuMD7#283212 - Daniel Kreiseder
相关:https://en.wikipedia.org/wiki/Yoda_conditions - Boann
5个回答

31

一些人使用方法2的原因是,如果您在=的位置错误地键入了==,则将得到编译器错误。

但是,像我这样的人仍然会使用方法1,因为他们发现它更易读,而且如果出现错误,它将在测试期间(或者在某些情况下,在代码的静态分析期间)被检测到。


11
告诉我,你是否曾经在任何地方犯过这个错误,并且如果以这种方式写下来,会不会发现这个错误?我将其写成“方法1”,因为它更易读,而且我非常确定在25年写C和类C语言的经历中,我从未将“=”错误地写成“==”。 - Paul Tomblin
5
发生在我身上的过去事件。你应该觉得自己很幸运。 - Ori Pessach
3
在过去的几年里,我至少三次修复了一个长期存在的 bug,原因是在 if (或 while) 语句中进行赋值,而本应该进行比较。但是,需要指出的是,有些编译器(尤其是 gcc)会在只包含赋值(没有比较)时生成警告,除非将其包含在额外的括号中。不过,在所有编译器中都保证将常量放在第一位可以正常工作。 - Jerry Coffin
2
Paul:不,我不是因为有信心在静态分析或测试中发现a = / ==错误才这样写的。然而,第一句话确实是那些用另一种方式编写代码的人所提出的论点。 - Thomas Owens
2
@Paul:我以前犯过一两次这种错误,但通常很容易发现。编译器的警告是荒谬的,因为如果你记得使用 3==var,那么你会记得检查是否有拼写错误。 - DisgruntledGoat
显示剩余6条评论

10
唯一的区别在于 ( CONST_VALUE == variable ) 这种写法避免了常见的拼写错误 ( CONST_VALUE = variable ) 编译通过的情况。
相比之下,如果使用 ( variable = CONST_VALUE ) 的写法,编译器会将其理解为你要将 CONST_VALUE 赋值给 'variable'。
在 C 语言中,= 和 == 混淆是一个相当普遍的 bug 来源,因此人们试图通过编程规范来绕开这个问题。
当然,如果你正在比较两个变量,则这并不能帮助你避免出错。
而且,这个问题似乎是重复的:如何检查是否相等?(0 == i)还是(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

2

第一种变量

if (variable == CONST_VALUE) 

更好,因为它更易读。它遵循惯例(数学中也使用的惯例),即最变化的值排在最前面。

第二种变体

if (CONST_VALUE == variable)

有些人使用它来防止将等号检查与赋值混淆

if (CONST_VALUE = variable)

有更好的方法可以实现这一点,例如启用并注意编译器警告。

1

其他人已经指出了原因。= / ==混淆。我更喜欢第一个版本,因为它更紧密地遵循了思维过程。一些编译器通过在遇到类似情况时发出警告来缓解=和==的混淆。

if(a=b)

在这种情况下,如果你真的想要进行赋值操作,你就不得不写。
if((a=b)) 

然后我会将其写成

if( (a=b) != 0) 

为了避免混淆。
我们的代码中有一种情况,我们在a = / ==混淆,并将其反过来写也无济于事,因为这是变量之间的比较。

在GCC中,该选项为-Wparentheses。 - Adisak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接