有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java布尔相等:0==a,操作数顺序重要吗?

我看到一些人在他们的代码中写了这个布尔等式,我通常把常量放在“==”操作符的右边。我注意到0==a的运算速度比a==0快。有人能解释一下原因吗?最好的做法是什么


共 (6) 个答案

  1. # 1 楼答案

    它是C/C++世界的遗迹

    在C语言中,写0 == a与写a == 0相比的优点是,您不能意外地写a = 0,这意味着完全不同的东西。因为0是右值,0 = a是非法的

    在Java中,这种推理不适用,因为a = 0也是非法的(因为0不是布尔的,a不能是布尔的)。不过这并不痛,所以选择哪一个其实并不重要

    表现与此毫无关系

  2. # 2 楼答案

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

    在java中,这种可能性要小得多,因为

    if (a = 0) {}
    

    是不合法的,不是布尔值

  3. # 3 楼答案

    • 在速度方面a == 00 == a的速度相同
    • 然而,人们编写0==a只是为了不把===弄错,因为a = 0在if/while/中以某些编程语言编译。。语句和结果程序的行为不正确
  4. # 4 楼答案

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

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

    在以下情况下将导致异常:

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

    这样可以防止不必要的异常

  5. # 5 楼答案

    正如其他答案所描述的,将常量放在==左边的惯例是为了防止程序员出错。它被称为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(注意单个=)这样的错误,它不会测试相等性,而是赋值给var,并返回赋值值。赋值的值是整数,在许多编程语言中可以在布尔上下文中使用。但是,在Java中,整数不能用于布尔上下文,因此您不必担心错误地键入一个单等号而不是双等号,因为编译器会将其标记为错误。因此,您应该更喜欢Java中的a == 0,而不是相反的版本,后者稍微复杂一些,更难阅读

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

    Critics of Yoda conditions see the lack of readability as a disadvantage that does not outweigh the benefits described above. Some programming languages do not allow variable assignments within conditionals, so this error is impossible to make.

  6. # 6 楼答案

    你能为0==aa==0快的语句提供一个基准吗。我只是查看了两个文件的字节码,它们的不同之处在于它们选择的常量是否位于==的左右两侧,并且没有发现字节码的差异

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