So for binary operators on booleans, Java has &
, |
, ^
, &&
and ||
.
Let's summarize what they do briefly here:
For
&
, the result value istrue
if both operand values aretrue
; otherwise, the result isfalse
.For
|
, the result value isfalse
if both operand values arefalse
; otherwise, the result istrue
.For
^
, the result value istrue
if the operand values are different; otherwise, the result isfalse
.The
&&
operator is like&
but evaluates its right-hand operand only if the value of its left-hand operand istrue
.The
||
operator is like|
, but evaluates its right-hand operand only if the value of its left-hand operand isfalse
.
Now, among all 5, 3 of those have compound assignment versions, namely |=
, &=
and ^=
. So my question is obvious: why doesn't Java provide &&=
and ||=
as well? I find that I need those more than I need &=
and |=
.
And I don't think that "because it's too long" is a good answer, because Java has >>>=
. There must be a better reason for this omission.
From 15.26 Assignment Operators:
There are 12 assignment operators; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
A comment was made that if &&=
and ||=
were implemented, then it would be the only operators that do not evaluate the right hand side first. I believe this notion that a compound assignment operator evaluates the right hand side first is a mistake.
From 15.26.2 Compound Assignment Operators:
A compound assignment expression of the form
E1 op= E2
is equivalent toE1 = (T)((E1) op (E2))
, whereT
is the type ofE1
, except thatE1
is evaluated only once.
As proof, the following snippet throws a NullPointerException
, not an ArrayIndexOutOfBoundsException
.
int[] a = null; int[] b = {}; a[0] += b[-1];
The OR operator can be used with the if statement to execute a block of code. The if statement executes some code when a condition is true or not. We can use the OR operator to compare multiple conditions in the if statement.
Compound-assignment operators provide a shorter syntax for assigning the result of an arithmetic or bitwise operator. They perform the operation on the two operands before assigning the result to the first operand.
The >>> operator does not exist in Java. The other operators are valid.
The symbol && denotes the AND operator. It evaluates two statements/conditions and returns true only when both statements/conditions are true.
The operators &&=
and ||=
are not available on Java because for most of the developers these operators are:
&&=
If Java allowed &&=
operator, then that code:
bool isOk = true; //becomes false when at least a function returns false isOK &&= f1(); isOK &&= f2(); //we may expect f2() is called whatever the f1() returned value
would be equivalent to:
bool isOk = true; if (isOK) isOk = f1(); if (isOK) isOk = f2(); //f2() is called only when f1() returns true
This first code is error-prone because many developers would think f2()
is always called whatever the f1() returned value. It is like bool isOk = f1() && f2();
where f2()
is called only when f1()
returns true
.
If the developer wants f2()
to be called only when f1()
returns true
, therefore the second code above is less error-prone.
Else &=
is sufficient because the developer wants f2()
to be always called:
&=
bool isOk = true; isOK &= f1(); isOK &= f2(); //f2() always called whatever the f1() returned value
Moreover, the JVM should run this above code as the following one:
bool isOk = true; if (!f1()) isOk = false; if (!f2()) isOk = false; //f2() always called
&&
and &
resultsAre the results of operators &&
and &
the same when applied on boolean values?
Let's check using the following Java code:
public class qalcdo { public static void main (String[] args) { test (true, true); test (true, false); test (false, false); test (false, true); } private static void test (boolean a, boolean b) { System.out.println (counter++ + ") a=" + a + " and b=" + b); System.out.println ("a && b = " + (a && b)); System.out.println ("a & b = " + (a & b)); System.out.println ("======================"); } private static int counter = 1; }
Output:
1) a=true and b=true a && b = true a & b = true ====================== 2) a=true and b=false a && b = false a & b = false ====================== 3) a=false and b=false a && b = false a & b = false ====================== 4) a=false and b=true a && b = false a & b = false ======================
Therefore YES we can replace &&
by &
for boolean values ;-)
So better use &=
instead of &&=
.
||=
Same reasons as for &&=
:
operator |=
is less error-prone than ||=
.
If a developer wants f2()
not to be called when f1()
returns true
, then I advice the following alternatives:
// here a comment is required to explain that // f2() is not called when f1() returns false, and so on... bool isOk = f1() || f2() || f3() || f4();
or:
// here the following comments are not required // (the code is enough understandable) bool isOk = false; if (!isOK) isOk = f1(); if (!isOK) isOk = f2(); //f2() is not called when f1() returns false if (!isOK) isOk = f3(); //f3() is not called when f1() or f2() return false if (!isOK) isOk = f4(); //f4() is not called when ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With