这可能是一个愚蠢的问题,但好奇心使我变得更好。我最近看到的代码似乎“颠倒”了关系运算符的表达式顺序,例如:
if (0 == someVariable)
与我通常看到/写的相反:
if (someVariable == 0)
对我来说,第二种方法似乎更具可读性和直观性,所以我想知道我看到第一种方法是否有某些原因?从逻辑上讲,这两个语句的计算结果相同,那么它们的编写方式只是个人喜好问题吗?
这可能是一个愚蠢的问题,但好奇心使我变得更好。我最近看到的代码似乎“颠倒”了关系运算符的表达式顺序,例如:
if (0 == someVariable)
与我通常看到/写的相反:
if (someVariable == 0)
对我来说,第二种方法似乎更具可读性和直观性,所以我想知道我看到第一种方法是否有某些原因?从逻辑上讲,这两个语句的计算结果相同,那么它们的编写方式只是个人喜好问题吗?
我明白这是个人喜好。尽管通过将变量放在第二位,您可以确保您不会意外地将常量分配给曾经关心 c 开发人员的变量。这可能就是为什么您在 c# 中看到它作为开发人员切换语言的原因。
顺序无关紧要,但是,前者意味着它是您要检查的零。惯例规定使用 hte 后者。
C 和 C++ 中的主要原因是易于键入
if (someVariable = 0) {
...
}
它总是失败并且也设置someVariable
为0。
我个人更喜欢变量优先的风格,因为它读起来更自然,只是希望我不要忘记使用==
not =
。
如果您在if
. if
Java 和 C# 通过在子句中禁止非布尔表达式来避免这个问题。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 样式,除非您愿意这样做。
后一种格式是 C 语法的遗留格式,如果您无意中遗漏了一个等号,它会进行赋值,而不是比较。
但是,您当然不能分配给数字文字,因此如果您像第二个示例那样编写它,您会得到编译器错误,而不是错误。
但是,在 C# 中,您不能无意中这样做,所以这并不重要。
除了平等之外,我还经常遇到类似的代码
if (0 > number)
或者
if (NULL != pointer)
在 C/C++ 中甚至没有犯错的危险!这是一种善意的教学技巧变成了明显的坏习惯的情况之一。