关系运算符表达式顺序

时间:2008-09-18 12:17:44

标签: c# operators logical-operators

这可能是一个愚蠢的问题,但好奇心已经变得更好了。我最近看到的代码似乎“颠倒”关系运算符的表达式顺序,例如:

if (0 == someVariable)

与我通常看/写的相反:

if (someVariable == 0)

对我来说,第二种方法似乎更具可读性和直观性,所以我想知道是否有某些原因我看到了第一种方法?从逻辑上讲,这两个陈述都会评估相同的结果,所以这只是个人偏好的问题,如何写出来?

6 个答案:

答案 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 ++中甚至没有出错的危险!这是一种善意的教学技巧已成为一种普通坏习惯的情况之一。

相关问题