布尔值相等:0 == a,操作数顺序是否重要?

时间:2014-04-09 18:12:19

标签: java equals-operator

我看到有些人在他们的代码中写了这个布尔值相等,我通常把常量放在" =="的右边。运营商。我注意到0 == a比a = 0更快的操作。有人可以解释为什么吗?什么是它的最佳实践?

7 个答案:

答案 0 :(得分:7)

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

在C中,撰写0 == aa == 0的优势在于您不会意外地编写a = 0,这意味着完全不同的东西。由于0是左值,0 = a是非法的。

在Java中,推理不适用,因为a = 0也是非法的(因为0不是布尔值,a不能是布尔值)。虽然它并没有受到伤害,所以选择哪一个并不重要。

表演完全与此无关。

答案 1 :(得分: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这样的错误(注意单=),这不会测试相等性,而是 assign var并返回赋值的值。赋值的值是一个整数,在许多编程语言中都可以在布尔上下文中使用。但是,在Java中,整数不能在布尔上下文中使用,因此您不必担心错误地键入单个等于而不是双等号,因为它将被标记为编译器为错误。因此,您应该更喜欢Java中的a == 0,而不是反过来更复杂,更难阅读。

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

  

对尤达条件的批评者认为缺乏可读性是一个不会超过上述好处的劣势。某些编程语言不允许在条件语句中进行变量赋值,因此无法进行此错误。

答案 2 :(得分:1)

  • 速度问题a == 00 == a具有相同的速度。
  • 然而人们写0 == a只是不要将===弄错,因为a = 0在if / while / ..语句中编译某些编程语言并导致错误的行为该计划

答案 3 :(得分:1)

您能否为0==aa==0更快的陈述提供基准。我只是查看了两个文件的字节码,这两个文件的区别仅在于它们选择是否在==左边的常量,并且没有发现字节码的差异。

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

答案 4 :(得分:0)

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

在java中,它的可能性非常小,如

if (a = 0) {}

不合法,不是布尔值。

答案 5 :(得分:0)

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

String s = null;

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

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

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

这种方式可以防止不必要的异常。

答案 6 :(得分:-1)

if(0 == a){...}与if(a == 0){...}相同。当设置条件为真时,代码将始终运行。放置变量值是合乎逻辑的/心理的。在常数" 0"之前。即if(a == 0){...}。