Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my if statement behaving this way?

Tags:

java

I ran across this puzzle today. Obviously, this isn't correct style, but I'm still curious as to why no output is coming out.

int x = 9;
int y = 8;
int z = 7;

if (x > 9) if (y > 8) System.out.println("x > 9 and y > 8");

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");

else
  System.out.println("x <= 9 and z < 7");

The above has no output when run. But, when we add in brackets for the if-statement, suddenly the logic behaves as I expect.

int x = 9;
int y = 8;
int z = 7;

if (x > 9) {
  if (y > 8) System.out.println("x > 9 and y > 8");
}

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");

else
  System.out.println("x <= 9 and z < 7");

This outputs "SHOULD OUTPUT THIS x <= 9 and z >= 7". What is going on here?

Thanks!

like image 622
beachwood23 Avatar asked Oct 05 '12 04:10

beachwood23


2 Answers

If you rewrite the first way like this (which is how it is behaving), it is easier to understand

if (x > 9)
  if (y > 8) System.out.println("x > 9 and y > 8");
  else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
  else
    System.out.println("x <= 9 and z < 7");

Since x is not > 9, the block never executes.

like image 120
Jeff Storey Avatar answered Oct 05 '22 05:10

Jeff Storey


This:

if (x > 9) ... if (y > 8) ... else if (z >= 7) ... else

is ambiguous, because during parsing the else could be bound to the first if or the second if. (This is called the dangling else problem). The way Java (and many other languages) deals with this is to make the first meaning illegal, so the else clauses always bind to the innermost if statements.

like image 45
Ismail Badawi Avatar answered Oct 05 '22 05:10

Ismail Badawi