【问题标题】:relational operator expression order关系运算符表达式顺序
【发布时间】:2010-09-10 15:46:17
【问题描述】:

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

if (0 == someVariable)

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

if (someVariable == 0)

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

【问题讨论】:

  • 感谢大家的回答!我的好奇心得到了满足。
  • 问得好,亚当。我正要问完全相同的问题。

标签: c# operators logical-operators


【解决方案1】:

顺序并不重要,但是,前者意味着它 s 你正在检查的零。约定使用 hte 后者。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        但是,你当然不能分配给数字文字,所以如果你像第二个例子那样写它,你会得到一个编译器错误,而不是一个错误。

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

        【讨论】:

        • 如果你是那种使用if (is_error == false) ... 的人,那么你可以想象写if (is_error = false) .. 并且C# 编译器会接受它。不太可能发生,但一个足够反常的程序员可以管理它。 :-)
        【解决方案5】:

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

        if (someVariable = 0) {
            ...
        }
        

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

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

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

        【讨论】:

          【解决方案6】:

          除了相等之外,我经常遇到类似

          的代码
          if (0 > number)
          

          if (NULL != pointer)
          

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

          【讨论】:

            猜你喜欢
            • 2016-06-06
            • 1970-01-01
            • 1970-01-01
            • 2016-02-19
            • 1970-01-01
            • 1970-01-01
            • 2020-12-03
            相关资源
            最近更新 更多