Dav*_*son 84 java assignment-operator or-operator compound-assignment
我在Java中有很长的比较,我想知道它们中的一个或多个是否真实.比较字符串很长且难以阅读,因此我将其分解以便于阅读,并自动使用快捷操作符|=而不是negativeValue = negativeValue || boolean.
boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);
Run Code Online (Sandbox Code Playgroud)
negativeValue如果任何默认的<something>值为负,我希望是真的.这有效吗?它会做我期望的吗?我在Sun的网站或stackoverflow上看不到它,但Eclipse似乎没有问题,代码编译和运行.
同样,如果我想执行几个逻辑交叉点,我可以使用&=而不是&&吗?
pol*_*nts 195
它|=是布尔逻辑运算符的复合赋值运算符(JLS 15.26.2)|(JLS 15.22.2); 不要与条件或||(JLS 15.24)混淆.也有&=与^=对应于所述化合物分配版本布尔逻辑&和^分别.
换句话说,因为boolean b1, b2,这两个是等价的:
b1 |= b2;
b1 = b1 | b2;
Run Code Online (Sandbox Code Playgroud)
(逻辑运算符之间的差异&和|)相比,他们的条件同行(&&和||)之处在于前者不"带有短路"; 后者呢.那是:
&并| 始终评估两个操作数&&并有条件地||评估正确的操作数; 只有当其值可能影响二进制操作的结果时,才会评估右操作数.这意味着在以下情况下不评估右操作数:
&&计算结果为false
false)||计算结果为true
true)所以回到你原来的问题,是的,结构是有效的,虽然|=是不完全的等价快捷=和||,它计算你想要什么.由于|=您使用中操作员的右侧是一个简单的整数比较操作,因此|不短路的事实是微不足道的.
有些情况下,当需要短路,甚至需要短路时,但您的情况不是其中之一.
不幸的是,与其他一些语言不同,Java没有&&=和||=.这在问题中讨论为什么Java没有条件和条件或运算符的复合赋值版本?(&& =,|| =).
Jon*_*eet 16
它不是||的"快捷方式"(或短路)运算符 和&&是(因为如果他们已经知道基于LHS的结果,他们将不会评估RHS)但它会在工作方面做你想做的事情.
作为区别的一个例子,如果text为null ,则此代码将没有问题:
boolean nullOrEmpty = text == null || text.equals("")
Run Code Online (Sandbox Code Playgroud)
而这不会:
boolean nullOrEmpty = false;
nullOrEmpty |= text == null;
nullOrEmpty |= text.equals(""); // Throws exception if text is null
Run Code Online (Sandbox Code Playgroud)
(显然你可以"".equals(text)为那个特例做些- 我只是想证明这个原则.)