=)运算符在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;
    

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

    链接地址: http://www.djcxy.com/p/2031.html

    上一篇: =) operator in Java

    下一篇: What are the differences between "=" and "<