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

if (0 == someVariable)

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

if (someVariable == 0)

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

有帮助吗?

解决方案

我明白这是个人喜好。尽管通过将变量放在第二位可以确保您不会意外地将常量分配给用于 C 开发人员的变量。这可能就是为什么当开发人员切换语言时您会在 C# 中看到它。

其他提示

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

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

if (someVariable = 0) {
    ...
}

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

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

如果您在一个常量中赋值,许多 C 和 C++ 编译器会发出警告 if。Java 和 C# 通过禁止非布尔表达式来避免这个问题 if 条款。Python 通过将赋值作为语句而不是表达式来避免这个问题。

第一种方法的存在是为了提醒自己不要在 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 样式,除非您愿意这样做。

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

if (0 > number)

或者

if (NULL != pointer)

在 C/C++ 中甚至不存在犯错误的危险!在这种情况下,善意的教学技巧变成了一种明显的坏习惯。

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

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

然而,在 C# 中,您不可能无意中执行此操作,因此这并不重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top