为什么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。
这是因为常见的拼写错误是输入=
而不是==
。