3

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

4

7 回答 7

7

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

在 C 中,写0 == avs.的优点a == 0是你不会意外地写a = 0,这意味着完全不同的东西。因为0是右值,0 = a所以是非法的。

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

性能与此完全无关。

于 2014-04-09T18:14:29.483 回答
3

正如其他答案所描述的,将常量放在左侧的约定==是为了防止程序员错误。这称为尤达条件(我将在答案末尾对此进行扩展)。

你讲性能,所以我建议你查看字节码:

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

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

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

于 2014-04-09T18:44:30.317 回答
1

你能提供一个0==aa==0. 我刚刚查看了两个文件的字节码,这两个文件的不同之处仅在于他们选择常量是否位于左侧的右侧,==并且发现字节码没有区别。

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

于 2014-04-09T18:20:25.373 回答
1
  • 在速度问题上和速度a == 0相同0 == a
  • 但是人们写 0 == a 只是为了不要误会===因为a = 0在 if/while/.. 语句中以某些编程语言编译并导致程序的错误行为
于 2014-04-09T18:19:26.623 回答
0

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

在java中,它的可能性要小得多,因为

if (a = 0) {}

是不合法的,不是布尔值。

于 2014-04-09T18:15:27.520 回答
0

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

String s = null;

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

将导致异常,同时:

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

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

于 2018-03-23T07:03:13.790 回答
-1

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

于 2014-04-10T01:11:46.687 回答