为什么if(constant == variable)是首选而不是if(variable == constant)

可能重复:
如何检查等于? (0 == i)或(i == 0)
为什么在C#中经常会看到“null!= variable”而不是“variable!= null”?
为什么一些有经验的程序员会这样写表达式?
在C ++中NULL!= value是什么意思?

例如,

int k =5; if( 5 == k ) { } 

比…更受欢迎

 if (k == 5) { } 

是否仅考虑格式化目的或背后是否有任何原因?

因为这种forms使得通过忘记其中一个等号来引入错误变得更加困难。 想象一下,如果你这样做:

 if (k = 5) 

这是为了比较,但它现在是一个任务! 更糟糕的是,它是合法的 ,它会以多种方式搞乱你的程序( k的值被改变,条件总是评估为true )。

与此形成鲜明对比

 if (5 = k) 

这是不合法的(您不能分配给文字),因此编译器会立即将其标记为错误。

也就是说,这种编写代码的方式(条件中的赋值)在今天并不像以前那样流行。 大多数现代编译器会将此标记为警告,因此不太可能未被发现。 我个人不喜欢第二种forms,因为编译器是帮助我不使用它。

如果你输错了

 if (k = 5) // instead of == 

然后你可能刚刚介绍了一个很难找到的bug。 (实际上,以前很难找到。现在,大多数编译器会将此标记为警告。)

但是,这会导致编译时错误

 if (5 = k) 

顺便说一句,这种风格叫做尤达条件:-)

这是为了避免错误

 if( k = 5 ) { } 

这总是等于真的。

A.谁说这是首选?!

我能想到的唯一原因是要避免:

  int k =5; if( 5 = k )//notice one "=" { } 

像这样你将得到一个编译错误,而另一种方式将工作。 但我认为它的可读性较差,不太受欢迎。

首先,大多数人更喜欢第二种forms,因为它感觉“更自然”; 第一种forms被认为是“逆转”,实际上通常被称为“尤达条件”。

使用第一种forms的基本原理是避免在输入=而不是==错误时意外分配。 因为在条件中你可以写任何表达式,所以允许= ,所以在错误输入指令的情况下

 if(k = 5) { } 

不会检查k是否等于5 ,但会将5分配给k并且,因为=返回对其左手操作符的引用,条件将被评估为true,并且将始终执行if body。

另一方面,如果你在Yoda条件中键入=而不是== ,你会得到

 if(5 = k) { } 

这会导致编译错误,因为您无法将任何内容分配给文字(5)。

虽然它们看起来是个好主意,但是“Yoda条件”看起来很奇怪,最重要的是,几乎所有打开警告的好编译器都会警告你,如果你在条件表达式中写一个赋值,那么大多数人只是使用“自然的外观”forms。

这是因为常见的拼写错误是输入=而不是==