1

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

if (0 == someVariable)

与我通常看到/写的相反:

if (someVariable == 0)

对我来说,第二种方法似乎更具可读性和直观性,所以我想知道我看到第一种方法是否有某些原因?从逻辑上讲,这两个语句的计算结果相同,那么它们的编写方式只是个人喜好问题吗?

4

6 回答 6

6

我明白这是个人喜好。尽管通过将变量放在第二位,您可以确保您不会意外地将常量分配给曾经关心 c 开发人员的变量。这可能就是为什么您在 c# 中看到它作为开发人员切换语言的原因。

于 2008-09-18T12:20:19.507 回答
2

顺序无关紧要,但是,前者意味着它是您要检查的零。惯例规定使用 hte 后者。

于 2008-09-18T12:19:35.843 回答
2

C 和 C++ 中的主要原因是易于键入

if (someVariable = 0) {
    ...
}

它总是失败并且也设置someVariable为0。

我个人更喜欢变量优先的风格,因为它读起来更自然,只是希望我不要忘记使用==not =

如果您在if. ifJava 和 C# 通过在子句中禁止非布尔表达式来避免这个问题。Python 通过让赋值语句而不是表达式来避免这个问题。

于 2008-09-18T12:22:05.133 回答
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 样式,除非您愿意这样做。

于 2008-09-18T12:20:08.790 回答
1

后一种格式是 C 语法的遗留格式,如果您无意中遗漏了一个等号,它会进行赋值,而不是比较。

但是,您当然不能分配给数字文字,因此如果您像第二个示例那样编写它,您会得到编译器错误,而不是错误。

但是,在 C# 中,您不能无意中这样做,所以这并不重要。

于 2008-09-18T12:21:33.123 回答
1

除了平等之外,我还经常遇到类似的代码

if (0 > number)

或者

if (NULL != pointer)

在 C/C++ 中甚至没有犯错的危险!这是一种善意的教学技巧变成了明显的坏习惯的情况之一。

于 2008-09-18T12:52:24.093 回答