2012-10-05 15 views
5

Hoy encontré este rompecabezas. Obviamente, este no es el estilo correcto, pero todavía tengo curiosidad de por qué no sale ningún resultado.¿Por qué mi sentencia if se comporta de esta manera?

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

Lo anterior no tiene salida cuando se ejecuta. Pero, cuando agregamos entre corchetes para el enunciado if, de repente la lógica se comporta como esperaba.

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

Esto da salida a "DEBERÍA Salida este x < = 9 y z> = 7". ¿Que esta pasando aqui?

Gracias!

+3

jaja ... El 'else' se aplica al nivel de anidación más interno. – Mysticial

Respuesta

7

Si vuelve a escribir la primera manera como esto (que es la forma en que se comporta), es más fácil de entender

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

Como x no> es 9, el bloque no se ejecuta nunca.

0

Sólo se soluciona el sangrado en su código y el problema se hace evidente:

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

Este:

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

es ambigua, ya que durante el análisis del else podría estar vinculado a la primera if o la segundo if. (Esto se llama the dangling else problem). La forma en que Java (y muchos otros lenguajes) tratan con esto es hacer que el primer significado sea ilegal, por lo que las cláusulas else siempre se vinculan a las declaraciones más internas if.

+0

La mejor respuesta, porque realmente explica cómo se llama el problema y por qué ocurre así. +1 – Vulcan

0

Puesto que está utilizando el bloque más en más interna nivel

Su código está siendo tratado como el siguiente código

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

La primera condición especificada con la sentencia if es falsa y control en no entrar en el código asociado con esa condición y simplemente llegando al final del programa e imprimiendo nada.

Es por eso que su práctica habitual es adjuntar declaraciones entre corchetes, incluso si está escribiendo una sola declaración.

Cuestiones relacionadas