【问题标题】:Boolean equal: 0 == a, does operand order matter?布尔等于:0 == a,操作数顺序重要吗?
【发布时间】:2014-05-23 03:14:15
【问题描述】:

我看到有些人在他们的代码中写了这个布尔等于,我通常将常量放在“==”运算符的右侧。我注意到 0 == a 的运算速度比 a == 0 快。有人能解释一下为什么吗?它的最佳做法是什么?

【问题讨论】:

  • 0 == a 并不比a == 0 快,反之亦然。是什么让你这么认为?
  • 您要问的是Yoda Condition - 没有性能差异,只有对错别字的安全性,并且它并不真正适用于Java,因为您不会意外分配 因为它必须是一个布尔表达式(当然,只要你不意外地在表达式中分配一个布尔值)
  • +1 作为问题是可以的,尽管他认为性能是错误的
  • @Jesper 这是关于 leetcode 的一个简单问题,我修改了解决方案,仅将 0 == a 更改为 a == 0,并注意到运行时间比以前长了一点。很抱歉认为这是理所当然的事情
  • 这是一个过时的 C/C++ 东西

标签: java equals-operator


【解决方案1】:

没有区别,但是如果您使用的是字符串对象,例如:

String s = null;

if(s.equals("yourValue")){
    // do something...
} else {
    // do other things...
}

将导致异常同时:

if("yourValue".equals(s)){
    // do something...
} else {
    // do other things...
}

这样可以避免不必要的异常。

【讨论】:

  • 所以它会防止早期失败的异常,让你以后遇到它。 :)
  • 您可以仅使用单个条件来执行此操作,而不是在任何可选操作之前放置 null 和空检查,但前提是我们积极看待。 :)
【解决方案2】:

if(0==a){ … } 与 if(a==0){ … } 相同。当设置的条件为真时,代码将始终运行。将变量值“a”放在常量“0”之前只是逻辑/心理上的。即如果(a==0){ … }。

【讨论】:

    【解决方案3】:

    正如其他答案所描述的,将常量放在== 左侧的约定是为了防止程序员出错。它被称为Yoda conditions(我将在答案末尾对此进行扩展)。

    你说的是性能,所以我建议你查看字节码:

    a == 0
    

    变成:

       5: iload_1       
       6: ifne          13
       9: iconst_1      
      10: goto          14
      13: iconst_0      
    

    0 == a
    

    变成:

      20: iload_1       
      21: ifne          28
      24: iconst_1      
      25: goto          29
      28: iconst_0   
    

    也就是说,两者在字节码层面上是完全一样的,所以它们之间不可能有性能差异。

    所以它真的归结为可读性。 int == var 形式的条件的主要目的是避免像 var = int 这样的错误(注意单个 =),它不会测试相等性,而是 assignvar 并返回赋值的价值。赋值的值是一个整数,在许多编程语言中可以在布尔上下文中使用。然而,在 Java 中,整数 不能 在布尔上下文中使用,因此您不必担心错误地输入了单等号而不是双等号,因为它会被标记为编译器作为错误。因此,您应该更喜欢 Java 中的a == 0,而不是稍微复杂且难以阅读的相反。

    事实上,我链接到的维基百科文章做出了这样的声明:

    Yoda 条件的批评者认为缺乏可读性是一个缺点,但并没有超过上述好处。一些编程语言不允许在条件语句中进行变量赋值,所以这个错误是不可能发生的。

    【讨论】:

      【解决方案4】:

      您能否为0==aa==0 更快的陈述提供一个基准。我刚刚查看了两个文件的字节码,这两个文件的区别仅在于他们选择常量是否位于== 的左侧右侧,发现字节码没有区别。

      许多人选择将常量放在左侧,以确保意外使用赋值运算符 = 而不是比较运算符 == 被编译器捕获。这在 Java 中不是什么问题,因为除非 a 的值是布尔值,否则不会进行类型检查。

      【讨论】:

        【解决方案5】:

        它是 C/C++ 世界的遗物。

        在 C 中,写 0 == aa == 0 的优点是你不能不小心写成 a = 0,这意味着完全不同的东西。由于0 是右值,所以0 = a 是非法的。

        在 Java 中,这种推理不适用,因为 a = 0 也是非法的(因为 0 不是布尔值,a 不能是布尔值)。不过它并没有什么坏处,所以选择哪一个真的并不重要。

        性能与此完全无关。

        【讨论】:

          【解决方案6】:

          在比较的左侧放置一个常量可以防止您测试赋值结果(在 C 中)。

          在java中这种可能性很小,因为

          if (a = 0) {}
          

          不合法,a 不是布尔值。

          【讨论】:

            【解决方案7】:
            • 在速度方面a == 00 == a 具有相同的速度。
            • 但是人们写 0 == a 只是为了不要将 === 混淆,因为 a = 0 在 if/while/.. 语句中以某些编程语言编译并导致程序的错误行为

            【讨论】:

              猜你喜欢
              • 2017-06-05
              • 2011-01-16
              • 1970-01-01
              • 1970-01-01
              • 2011-01-16
              • 2013-06-13
              • 2014-08-06
              • 2018-01-09
              • 2015-05-10
              相关资源
              最近更新 更多