2009-06-08 14 views
7

A menudo veo la cosa colgando manejado como:¿Cómo manejan los diferentes lenguajes el "resto que cuelga"?

if (x > 0) 
    if (y > 0) 
    print "hello" 
else 
    print "world" 

el analizador o intérprete en realidad coincida con la otra persona con el más cercano si la declaración, que es el "si (y> 0)".

¿Algún idioma tiene la trampa de realmente combinar el resto con el exterior si o el más lejano si? (excepto el Python obvio)

+0

Interesante pregunta, pero ¿cuál será la respuesta correcta? – ralphtheninja

+1

Creo que la respuesta podría ser: probablemente no haya un lenguaje que coincida con el otro con el más lejano si. Algunos idiomas hacen que sea obligatorio que lo dejes en claro aplicando llaves o simplemente usa la sangría para indicar cuál concuerda (Python). –

Respuesta

6

A falta de usar lenguajes sensibles al espacio (como Python, como dijiste), no veo por qué una interpretación sensata podría coincidir con el bloque if más externo.

Algunos idiomas prohíben esta ambigüedad potencial por:

  1. que requieren apoyos para todos los bloques, y
  2. Proporcionar especial "else if" sintaxis, por lo general elsif, elif, o elseif.
2

En Perl, los apoyos no son opcionales, que nos ayuda a evitar este tipo de problemas:

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
    else { 
     print "world" 
    } 
} 

frente

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
} 
else { 
    print "world" 
} 

IIRC, la mayoría de las guías de estilo C requieren/recomendar refuerzos para los bucles y condicionales.

1

C# hace lo "correcto". guión inteligente de Visual Studio pone automáticamente en el lugar correcto también:

if (x > 0) 
    if (y > 0) 
     Console.WriteLine("hello"); 
    else 
     Console.WriteLine("world"); 

Esto debería espera que sea sólo una cuestión teórica, ya que la costumbre de añadir de rizado en todas partes debe ser profundamente arraigada en la mayoría de los derivados de C, de lo contrario va a abrir la posibilidad de sorpresas desagradables.

+0

estudio visual además de la sangría, también elimina funcionalmente la "ambigüedad", mediante el uso de un 'final si'. "El problema también se puede resolver haciendo explícito el vínculo entre un else y its if, dentro de la sintaxis. Esto generalmente ayuda a evitar errores humanos. Wikipedia https://en.wikipedia.org/wiki/Dangling_else Posibles soluciones [a la" Ambiguous "colgando más" son: "Tener una declaración de" fin si ". Ejemplos de tales idiomas son ALGOL 68, Ada, Eiffel, PL/SQL, Visual Basic y Modula-2 "Supongo que aunque no es tan ambiguo ya que ningún lenguaje parece interpretarlo de otra manera. – barlop

3

Si cualquier lenguaje hiciera eso (excepto los idiomas centrados en sangría), tendrían que ir a una de las listas "¿cuál es el peor lenguaje?".

Esta es también la razón por la que casi siempre uso llaves para condicionales, y el 100% del tiempo cuando hay condicionales o bucles anidados. Los pocos caracteres adicionales vale la pena eliminar la posibilidad de confusión.

1

En Python no puede ser ambiguo al respecto. O tienes

if (x > 0): 
    if (y > 0): 
    print "hello" 
else: 
    print "world" 

o

if (x > 0) 
    if (y > 0) 
    print "hello" 
    else: 
    print "world" 

Los espectáculos de sangría, que "si" coincide con el "otro". [Nota: intente como sea posible, no puedo obtener el "else" en el primer ejemplo para alinear correctamente debajo del primer "si".]

En todos los idiomas que he visto que permiten esta particular ambigüedad, el "else" coincide con el "si" más reciente. Eso puede no ser cierto en todos los idiomas que alguna vez existieron. Por lo general, lo más fácil al escribir el analizador es hacer coincidir el "else" con el "si" más cercano en la pila.

Una pregunta similar: ¿Cuál es el resultado de 5 - 2 + 1? ¿Es 4 o 2? Personalmente, siempre uso paréntesis cuando escribo (x - y) + z o x - (y + z) porque nunca puedo recordar en qué dirección irá el analizador.

+0

Para la última parte, OMI no tendría sentido que la respuesta fuera 2. Ignorar el orden de las operaciones por un segundo, sería simplemente al revés. Todos los idiomas con los que he trabajado van de izquierda a derecha. (Aunque supongo que si el lenguaje fue diseñado para ser de derecha a izquierda, entonces eso tendría sentido, pero luego el programador debería/debería tenerlo en cuenta). –

+3

Hay 2 formas de interpretar 5 - 2 + 1 y ambas dan como resultado 4 1 .5 + (-2 +1) - combine el -2 y el primer 1 2. (5 - 2) + 1 - combine el 5 y el -2 primero – Hardwareguy

0

Si no coincide con el if más reciente, o bien todo se vuelve absurdo o no puede coincidir con otros ifs. Esta (la única alternativa real que puedo imaginar) no tendría sentido:

if(first) 
    if(second) 
     if(third) 
      doFirst(); 
     else 
      doSecond(); 
     else 
      doThird(); 

que es simplemente demasiado wtf.

0

La mayoría de los lenguajes coincidirán con el else con el if más interno, y eso es realmente lo único razonable que puede hacer un compilador no sensible al espacio en blanco. Muchos IDEs, como menciona Jeff, formatearán el código para que coincida con la estructura, pero en realidad, el uso de llaves alrededor de todos los bloques de código es una forma sensata de lidiar con esto.

+0

-1 "La mayoría de los idiomas coincidirán con el más interno" < --- eso sugiere que podrías saber de algunos que lo hacen Nuevo Testamento. Y lo que el que preguntaba era Qué idiomas no. Así que has evitado la pregunta, y has sugerido que algunos idiomas toman la otra interpretación, cuando muy posiblemente ningún idioma tome la otra interpretación.Si va a decir "La mayoría de los idiomas", debe indicar al menos 1 que no, de lo contrario puede inducir a error. – barlop

1

El Way C# funciona porque coincide con las declaraciones else en orden de las declaraciones else utilizadas.

es decir.

if (x == 1) 
    if (y == 1) 
     Console.WriteLine("Hello"); 
    else 
     Console.WriteLine("World"); 
else 
    Console.WriteLine("All your base are belong to us."); 

sin embargo, si desea cambiar a dónde va el resto.

if (x == 1) 
{ 
    if (y == 1) 
     Console.WriteLine("Hello World"); 
} 
else 
    Console.WriteLine("All your base are belong to us."); 
0

COBOL, antes de la introducción de la END-IF, dictamina que el ELSE pertenece a la más cercana SI.

Para lo demás, aparte de lo anterior, hay que equilibrar los FI con el mismo número de ELSE. Debido a que debe haber un imperativo, se debe agregar una cláusula NEXT SENTENCE. Como en cualquier otro caso [1] en COBOL, la elección de la solución parece la más detallada posible.

[1]: Evaluar cuándo DE OTRO MODO

Cuestiones relacionadas