java布尔相等:0==a,操作数顺序重要吗? 1 年,4 月 Questions & Answers 290 我看到一些人在他们的代码中写了这个布尔等式,我通常把常量放在“==”操作符的右边。我注意到0==a的运算速度比a==0快。有人能解释一下原因吗?最好的做法是什么
# 1 楼答案 它是C/C++世界的遗迹 在C语言中,写0 == a与写a == 0相比的优点是,您不能意外地写a = 0,这意味着完全不同的东西。因为0是右值,0 = a是非法的 在Java中,这种推理不适用,因为a = 0也是非法的(因为0不是布尔的,a不能是布尔的)。不过这并不痛,所以选择哪一个其实并不重要 表现与此毫无关系
# 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 楼答案 正如其他答案所描述的,将常量放在==左边的惯例是为了防止程序员出错。它被称为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 楼答案 你能为0==a比a==0快的语句提供一个基准吗。我只是查看了两个文件的字节码,它们的不同之处在于它们选择的常量是否位于==的左右两侧,并且没有发现字节码的差异 许多人选择将常量放在左边,以确保编译器捕获到意外使用赋值运算符=而不是比较运算符==。这在Java中不是什么问题,因为除非a的值是布尔值,否则不会进行类型检查
# 1 楼答案
它是C/C++世界的遗迹
在C语言中,写
0 == a
与写a == 0
相比的优点是,您不能意外地写a = 0
,这意味着完全不同的东西。因为0
是右值,0 = a
是非法的在Java中,这种推理不适用,因为
a = 0
也是非法的(因为0
不是布尔的,a
不能是布尔的)。不过这并不痛,所以选择哪一个其实并不重要表现与此毫无关系
# 2 楼答案
在比较的左侧放置一个常量可以防止测试赋值的结果(在C中)
在java中,这种可能性要小得多,因为
是不合法的,不是布尔值
# 3 楼答案
a == 0
和0 == a
的速度相同李>==
与=
弄错,因为a = 0
在if/while/中以某些编程语言编译。。语句和结果程序的行为不正确# 4 楼答案
没有区别,但如果您使用字符串对象,如:
在以下情况下将导致异常:
这样可以防止不必要的异常
# 5 楼答案
正如其他答案所描述的,将常量放在
==
左边的惯例是为了防止程序员出错。它被称为Yoda conditions(我将在答案的末尾对此进行详细说明)您谈论性能,因此我建议您查看字节码:
变成:
及
变成:
换句话说,这两者在字节码级别上是完全相同的,因此它们之间不会有性能差异
因此,它实际上归结为可读性。形式
int == var
的条件的主要目的是避免像var = int
(注意单个=
)这样的错误,它不会测试相等性,而是将赋值给var
,并返回赋值值。赋值的值是整数,在许多编程语言中可以在布尔上下文中使用。但是,在Java中,整数不能用于布尔上下文,因此您不必担心错误地键入一个单等号而不是双等号,因为编译器会将其标记为错误。因此,您应该更喜欢Java中的a == 0
,而不是相反的版本,后者稍微复杂一些,更难阅读事实上,我链接到的维基百科文章做出了如下声明:
# 6 楼答案
你能为
0==a
比a==0
快的语句提供一个基准吗。我只是查看了两个文件的字节码,它们的不同之处在于它们选择的常量是否位于==
的左右两侧,并且没有发现字节码的差异许多人选择将常量放在左边,以确保编译器捕获到意外使用赋值运算符
=
而不是比较运算符==
。这在Java中不是什么问题,因为除非a
的值是布尔值,否则不会进行类型检查