=)运算符在Java中
我在Java中做了一系列比较,我想知道它们中的一个或多个是否真实。 比较的字符串很长,很难阅读,所以为了便于阅读而将其分解,并自动使用快捷键运算符|=
而不是negativeValue = negativeValue || boolean
negativeValue = negativeValue || boolean
。
boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);
如果任何默认的<something>值为negativeValue
,我预计negativeValue
为true。 这有效吗? 它会做我期望的事情吗? 我看不到它在Sun的站点或stackoverflow上提到它,但Eclipse似乎没有问题,代码编译和运行。
同样,如果我想执行几个逻辑交点,我可以使用&=
而不是&&
?
|=
是布尔逻辑运算符|
的复合赋值运算符(JLS 15.26.2) (JLS 15.22.2); 不要与条件或||
混淆 (JLS 15.24)。 还有&=
和^=
对应于布尔逻辑&
和^
的复合赋值版本。
换句话说,对于boolean b1, b2
,这两个是等价的:
b1 |= b2;
b1 = b1 | b2;
逻辑运算符( &
和|
)与条件对应( &&
和||
)的区别在于前者不是“shortcircuit”; 后者呢。 那是:
&
和|
总是评估两个操作数 &&
和||
有条件地评估正确的操作数; 只有在其值可能影响二进制操作的结果时才评估右操作数。 这意味着在下列情况下不会评估右操作数: &&
的左操作数评估为false
false
) ||
的左操作数 评估为true
true
) 所以回到你原来的问题,是的,这个构造是有效的,而|=
并不完全等同于=
和||
快捷方式 它确实计算出你想要的。 由于您使用的|=
运算符的右侧是一个简单的整数比较操作,因此|
不短路不重要。
有些情况下,当需要短路时,甚至需要,但你的情况不是其中之一。
不幸的是,与其他一些语言不同,Java没有&&=
和||=
。 这个问题在Java中为什么没有条件语言和条件语言或运算符的复合赋值版本? (&& =,|| =)。
这不是||快捷方式(或短路)运营商的方式 和&&是(因为如果他们已经知道基于LHS的结果,他们不会评估RHS),但是它会按照你的工作需要来做。
作为差异的一个例子,如果text
为null,这段代码将会很好:
boolean nullOrEmpty = text == null || text.equals("")
而这不会:
boolean nullOrEmpty = false;
nullOrEmpty |= text == null;
nullOrEmpty |= text.equals(""); // Throws exception if text is null
(显然你可以为那个特定的情况做"".equals(text)
- 我只是试图说明原理。)
你可以只有一个声明。 用多行表示,它几乎完全像你的示例代码,只是不太必要:
boolean negativeValue
= defaultStock < 0
| defaultWholesale < 0
| defaultRetail < 0
| defaultDelivery < 0;
对于最简单的表达式,使用|
可以比||
更快 因为即使避免进行比较,也意味着隐式地使用分支,并且可能要贵很多倍。
上一篇: =) operator in Java