Java boolean |= operator

boolean-expression, compound-assignment, java, operators, specifications

Solution

From the JLS:

15.26.2. Compound Assignment Operators

A compound assignment expression of the form `E1 op= E2` is equivalent to `E1 = (T) ((E1) op (E2))`, where `T` is the type of `E1`, except that `E1` is evaluated only once.

15.22.2. Boolean Logical Operators `&`, `^`, and `|`

When both operands of a `&`, `^`, or `|` operator are of type `boolean` or `Boolean`, then the type of the bitwise operator expression is `boolean`. In all cases, the operands are subject to unboxing conversion (§5.1.8) as necessary.

For `|`, the result value is false if both operand values are false; otherwise, the result is true.

This means that

val |= somethingElse();

is strictly equivalent to

val = val | somethingElse();

(assuming `somethingElse()` returns `boolean` or `Boolean`).

I'd be curious if right operand is evaluated if left value already is true.

Yes, it would be evaluated, since `|` does not short-circuit:

15.7.2. Evaluate Operands before Operation

The Java programming language guarantees that every operand of an operator (except the conditional operators `&&`, `||`, and `? :`) appears to be fully evaluated before any part of the operation itself is performed.

15.24. Conditional-Or Operator `||`

Thus, `||` computes the same result as `|` on `boolean` or `Boolean` operands. It differs only in that the right-hand operand expression is evaluated conditionally rather than always.

Problem

Recently I saw a code using this: ``` boolean val = something(); val |= somethingElse(); ``` Interesting part is |= (binary like) operator made on boolean primitive type. It surprised me that |= exist for boolean, as if it was integer type, and searched Java specification for this operator, but could not find any. I'd be curious if right operand is evaluated if left value already is true. Can someone point me to Java specification of this?

Original source

Related problems