2012-10-05 15 views
5

Dziś przebiegłem tę zagadkę. Oczywiście, nie jest to poprawny styl, ale wciąż jestem ciekawy, dlaczego nie ma wyjścia.Dlaczego moje instrukcje if zachowują się w ten sposób?

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"); 

Powyższe dane nie zawierają danych wyjściowych po uruchomieniu. Ale kiedy dodamy nawiasy do instrukcji if, nagle logika zachowuje się tak, jak się spodziewam.

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"); 

Urządzenie wysyła "powinno Efekt ten x < = 9 i Z> = 7". Co tu się dzieje?

Dzięki!

+3

haha ​​... Symbol "else" odnosi się do najbardziej wewnętrznego poziomu zagnieżdżenia. – Mysticial

Odpowiedz

7

Jeśli przepisać pierwszy sposób jak to (co jest, jak zachowuje się), łatwiej jest zrozumieć

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"); 

Ponieważ x nie> jest 9, nigdy blok wykonuje.

0

Wystarczy naprawić wcięcia na kodzie i sprawa staje się jasna:

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"); 
4

to:

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

jest niejednoznaczny, ponieważ podczas parsowania else może być związany z pierwszym if albo drugi if. (Nazywa się to the dangling else problem). Sposób w jaki Java (i wiele innych języków) radzi sobie z tym, sprawia, że ​​pierwsze znaczenie jest nielegalne, więc klauzule else zawsze wiążą się z najgłębszymi stwierdzeniami if.

+0

Najlepsza odpowiedź, ponieważ w rzeczywistości wyjaśnia, w jaki sposób wywoływany jest problem i dlaczego tak się dzieje. +1 – Vulcan

0

Ponieważ używasz blok innego w wewnętrznej większości poziomie

Twój kod jest traktowane jako poniższym kodzie

if (x > 9) // This condition is false, hence the none of the following statement will be executed 
{ 
    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"); 
    } 
} 

pierwszy warunek określony w instrukcji if jest fałszywy i kontrola w nie wprowadzając do kodu związanego z tym warunkiem i po prostu do końca programu i drukowania nic.

Dlatego jego normalną praktyką jest dołączanie instrukcji w nawiasach, nawet jeśli piszesz pojedyncze oświadczenie.

Powiązane problemy