I am unable to understand why following if blocks execute. How the if conditions will be evaluated?
public class Test
{
public static void main(String[] args)
{
if (true || (false || true) && false)
{
System.out.println("How does this condition becomes true.");
}
if (false && (false || true) || true)
{
System.out.println("Same with this condition, why is it true.");
}
}
}
OR – =IF(OR(Something is True, Something else is True), Value if True, Value if False) NOT – =IF(NOT(Something is True), Value if True, Value if False)
Java if StatementThe if keyword is used to check if a condition is true or not. If it is true, then the specified code inside the curly braces are executed. Note: The condition inside the parentheses must be a boolean expression. That is, the result of the expression must either evaluate to true or false.
An if statement checks a boolean value and only executes a block of code if that value is true . To write an if statement, write the keyword if , then inside parentheses () insert a boolean value, and then in curly brackets {} write the code that should only execute when that value is true .
First of all, you must already know false || true
is true
.
Apart from that, you need to know the other two things:
The && and || operators "short-circuit", meaning they don't evaluate the right hand side if it isn't necessary.
When operators of equal precedence appear in the same expression, a rule must govern which is evaluated first. All binary operators except for the assignment operators are evaluated from left to right; assignment operators are evaluated right to left.
From the precedence table, we know &&
is higher than ||
.
So in your question, let's do the basic reasoning.
if (true || (false || true) && false)
true || no_matter_what_is_in_right_side
will be true
, so we got a true
.
if (false && (false || true) || true)
This one is trickier than the previous, this time we have to consider the annoying precedence. We do the reasoning as:
false && no_matter_what_is_in_right_side
will be false
and all we have left is:
false || true
Again we have true
in the end.
But if you already noticed the trick: we start from the rightmost true
then we can do the reasoning as the previous one directly get the true
.
As Michael mentioned, we'd better use parenthesis to express the exact order instead of relying on the precedence, which is actually hard to remember ##.
&&
has higher precedence than ||
(source). So adding in parens to emphasize how those are being evaluated:
if (true || ((false || true) && false))
// -------------^-------------------------^
and
if ((false && (false || true)) || true)
// -----^-------------------------^
As you can see, you end up with x || y
where x
is true
in the first example, and y
is true in the second example. Naturally both true || false
and false || true
are true
.
You can see it in action by using a method that outputs what it's doing (live copy) (remember that both ||
and &&
short-circuit, meaning they don't evaluate operands that cannot change the result):
public class Test
{
private static boolean b(String label, boolean value) {
System.out.println(label + ": " + value);
return value;
}
public static void main(String[] args)
{
if (b("1", true) || (b("2", false) || b("3", true)) && b("4", false))
{
System.out.println("How does this condition becomes true.");
}
if (b("5", false) && (b("6", false) || b("7", true)) || b("8", true))
{
System.out.println("Same with this condition, why is it true.");
}
}
}
When run, that outputs:
1: true How does this condition becomes true. 5: false 8: true Same with this condition, why is it true.
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