我看到有些人在他们的代码中写了这个布尔等于,我通常将常量放在“==”运算符的右侧。我注意到 0 == a 的运算速度比 a == 0 快。有人能解释一下为什么吗?它的最佳做法是什么?
7 回答
它是 C/C++ 世界的遗物。
在 C 中,写0 == a
vs.的优点a == 0
是你不会意外地写a = 0
,这意味着完全不同的东西。因为0
是右值,0 = a
所以是非法的。
在 Java 中,这种推理不适用,因为a = 0
也是非法的(因为0
不是布尔值,a
所以不能是布尔值)。不过这并没有什么坏处,所以选择哪一个并不重要。
性能与此完全无关。
正如其他答案所描述的,将常量放在左侧的约定==
是为了防止程序员错误。这称为尤达条件(我将在答案末尾对此进行扩展)。
你讲性能,所以我建议你查看字节码:
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 == 0
Java,而不是稍微复杂且难以阅读的相反。
事实上,我链接到的维基百科文章做出了这样的声明:
尤达条件的批评者认为缺乏可读性是一个不超过上述好处的缺点。一些编程语言不允许在条件句中进行变量赋值,所以这个错误是不可能发生的。
你能提供一个0==a
比a==0
. 我刚刚查看了两个文件的字节码,这两个文件的不同之处仅在于他们选择常量是否位于左侧的右侧,==
并且发现字节码没有区别。
许多人选择将常量放在左侧,以确保意外使用赋值运算符=
而不是比较运算符==
被编译器捕获。在 Java 中这不是一个问题,因为除非值a
是布尔值,否则不会进行类型检查。
- 在速度问题上和速度
a == 0
相同0 == a
。 - 但是人们写 0 == a 只是为了不要误会
==
,=
因为a = 0
在 if/while/.. 语句中以某些编程语言编译并导致程序的错误行为
在比较的左侧放置一个常量可以防止您测试赋值结果(在 C 中)。
在java中,它的可能性要小得多,因为
if (a = 0) {}
是不合法的,不是布尔值。
没有区别,但是如果您使用的是字符串对象,例如:
String s = null;
if(s.equals("yourValue")){
// do something...
} else {
// do other things...
}
将导致异常,同时:
if("yourValue".equals(s)){
// do something...
} else {
// do other things...
}
这种方式将防止不必要的异常。
if(0==a){ … } 与 if(a==0){ … } 相同。当设置的条件为真时,代码将始终运行。将变量值“a”放在常量“0”之前只是逻辑/心理上的。即如果(a==0){ … }。