这可能是一个愚蠢的问题,但好奇心已经变得更好了。我最近看到的代码似乎“颠倒”关系运算符的表达式顺序,例如:
if (0 == someVariable)
与我通常看/写的相反:
if (someVariable == 0)
对我来说,第二种方法似乎更具可读性和直观性,所以我想知道是否有某些原因我看到了第一种方法?从逻辑上讲,这两个陈述都会评估相同的结果,所以这只是个人偏好的问题,如何写出来?
答案 0 :(得分:6)
我知道这是个人偏好。虽然通过将变量放在第二位,您可以确保不会意外地将常量分配给用于隐藏c开发人员的变量。这可能是你在c#中看到它作为开发人员切换语言的原因。
答案 1 :(得分:2)
顺序并不重要,但前者暗示它 你正在检查零。公约要求使用后者。
答案 2 :(得分:2)
C和C ++的主要原因是它很容易输入
if (someVariable = 0) {
...
}
始终失败,并将someVariable
设置为0。
我个人更喜欢变量优先的风格,因为它更自然地阅读,并希望我不要忘记使用==
而不是=
。
如果在if
内分配常量,许多C和C ++编译器都会发出警告。
Java和C#通过禁止if
子句中的非布尔表达式来避免此问题。
Python通过使赋值语句而不是表达式来避免这个问题。
答案 3 :(得分:1)
第一种方法的存在是为了提醒自己不要在IF语句中进行分配,这可能会在某些语言中产生灾难性后果(C / C ++)。在C#中,如果你设置的是布尔值,你只会被它咬伤。
可能致命的C代码:
if (succeeded = TRUE)
{
// I could be in trouble here if 'succeeded' was FALSE
}
在C / C ++中,当你想要VAR == CONSTANT时,任何变量都容易受到VAR = CONSTANT这个问题的影响。因此,如果你把这种情况搞砸了,通常需要重新排序你的IF语句以接收编译错误:
if (TRUE = succeeded)
{
// This will fail to compile, and I'll fix my mistake
}
在C#中,只有布尔表达式易受此影响,因为只有布尔表达式在if语句中有效。
if (myInteger = 9)
{
// this will fail to compile
}
所以,在C#世界中,没有必要采用CONSTANT == VAR风格,除非你觉得这样做。
答案 4 :(得分:1)
后一种格式是C语法的遗留问题,如果你无意中遗漏了其中一个等号,它会做一个赋值,而不是比较。
但是,您当然不能分配给数字文字,因此如果您像第二个示例一样编写它,您将收到编译器错误,而不是错误。
然而,在C#中,你不能无意中这样做,所以它并不重要。
答案 5 :(得分:1)
除了平等,我经常会遇到像
这样的代码if (0 > number)
或
if (NULL != pointer)
在C / C ++中甚至没有出错的危险!这是一种善意的教学技巧已成为一种普通坏习惯的情况之一。