JAVA中的OR运算_Java中的快捷方式“or-assignment”(| =)运算符

问题

我在Java中有很长的比较,我想知道它们中的一个或多个是否真实。比较字符串很长且难以阅读,因此我将其分解以便于阅读,并自动使用快捷方式operator|=而不是negativeValue = negativeValue || boolean。

boolean negativeValue = false;

negativeValue |= (defaultStock < 0);

negativeValue |= (defaultWholesale < 0);

negativeValue |= (defaultRetail < 0);

negativeValue |= (defaultDelivery < 0);

如果任何默认的值为负,我希望negativeValue为真。这有效吗?它会做我期望的吗?我在Sun的网站或stackoverflow上看不到它,但Eclipse似乎没有问题,代码编译和运行。

同样,如果我想执行几个逻辑交叉点,我可以使用&=而不是&&吗?

#1 热门回答(183 赞)

|=是布尔逻辑运算符|(JLS 15.22.2)的复合赋值运算符(JLS 15.26.2);不要与conditional-or||(JLS 15.24)混淆。还有&=和^=分别对应于布尔逻辑&和^的复合赋值版本。

换句话说,对于boolean b1, b2,这两个是等价的:

b1 |= b2;

b1 = b1 | b2;

与条件对应物(&&和||)相比,逻辑运算符(&和|)之间的区别在于前者不是"短路";后者呢。那是:

&和|总是评估两个操作数

&&和||有条件地评估正确的操作数;仅当右侧操作数的值可能影响二进制操作的结果时,才会对其进行求值。这意味着在以下情况下不计算右操作数:&&的左操作数计算为false(因为无论右操作数的计算结果如何,整个表达式都为false)||的左操作数求值为true(因为无论右操作数的计算结果如何,整个表达式都为真)

所以回到你原来的问题,是的,那个结构是有效的,而虽然216353670并不完全是=和||的等效快捷方式,但它确实可以计算你想要的东西。由于|=操作员的右侧使用是一个简单的整数比较操作,因此|不是短路的事实是微不足道的。

有些情况下,当需要短路或甚至需要短路时,但你的情况不是其中之一。

#2 热门回答(16 赞)

它不是||的"快捷方式"(或短路)运算符和&&是(因为如果他们已经知道基于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) - 我只是想证明这个原则。)

#3 热门回答(3 赞)

你可以只有一个陈述。在多行中表示它几乎与你的示例代码完全相同,只是不那么重要:

boolean negativeValue

= defaultStock < 0

| defaultWholesale < 0

| defaultRetail < 0

| defaultDelivery < 0;

对于最简单的表达式,使用|可以比||更快,因为即使它避免进行比较,也意味着隐式使用分支并且可能要贵很多倍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值