2011-06-05 7 views
10

¿Cuál es el significado deformas de control de cortocircuito Ada

x AND THEN y AND z 

es que

x AND THEN (y AND z) 

(y, z nunca se evaluó si x es FALSO) o

(x AND THEN y) AND z 

(si x es FALSO, y se omite, pero es posible que se evalúe z) in ada?

+3

GNAT rechazará para compilar el primer ejemplo con mensaje de error "operadores lógicos mixtos en la expresión". – oenone

Respuesta

4

Los operadores de cortocircuito tienen la misma precedencia que sus versiones estrictas.

+1

[AARM §4.5 (17.a)] (http://www.adaic.org/resources/add_content/standards/05aarm/html/AA-4-5.html) señala que la precedencia detallada está "implícita en la sintaxis" reglas, "en este caso [§4.4 Expresiones] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-4.html). – trashgod

+0

Eso no responde completamente a la pregunta, ya que "AND" y "AND THEN" tienen la misma precedencia y podrían evaluarse "al mismo tiempo", o dado que AND es conmutativa, en un orden arbitrario. * Dado * la misma precedencia, creo que la regla es que los operadores a la derecha solo se evalúan después de que se hayan evaluado las operaciones "... ENTONCES" a su izquierda, que no han determinado el resultado del subtítulo de la misma precedencia. –

+1

@Ira Baxter: No sigo. [§4.5 (8)] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-5.html) continúa diciendo que para "operadores del mismo nivel de precedencia, los operadores están asociados con sus operandos en orden textual de izquierda a derecha ". ¿Qué más se necesita? – trashgod

3

Como MRAB & Ira & basura han dicho que tienen la misma pecedence, sin embargo lo que no se ha señalado explícitamente es que los operadores "y luego" & "o bien" hará que la expresión para regresar (evaluación final) tan pronto como se pueda determinar un resultado.

Por ejemplo (en pseudocódigo):

if Almost_always_true_fn() or else costly_fn() then 
    do_stuff; 
end if; 

mayoría de las veces sólo la primera función (Almost_always_true_fn) serán evaluados, y sólo cuando que devuelve false se costly_fn ser ejecutado.

Compare esto con:

if Almost_always_true_fn() or costly_fn() then 
    do_stuff; 
end if; 

En este caso, tanto Almost_always_true_fn() y costly_fn() serán evaluados.

NWS.

4

El comentario de @enone menciona que GNAT rechaza x AND THEN y AND z, pero no explica por qué. Es cierto, en cierto sentido, que and y and then tienen la misma precedencia, pero esa no es toda la historia.

La gramática para una expresión es:

expression ::= 
    relation {and relation} | relation {and then relation} 
    | relation {or relation} | relation {or else relation} 
    | relation {xor relation} 

donde { FOO } denota cero o más ocurrencias de FOO.

Esta gramática está específicamente diseñada para permitir que cualquiera de estos operadores o formularios de control se encadena en una sola expresión (X and Y and Z, A and then B and then C), pero prohíbe mezclarlos. Entonces, la expresión en la pregunta, x AND THEN y AND z, es ilegal, y la pregunta de qué significa ni siquiera surge. El objetivo de esta regla es precisamente evitar la confusión en casos como este.

Solo tiene que escribir (X and then Y) and Z o X and then (Y and Z), el que coincida con lo que desea hacer.

Lo mismo se aplica a la mezcla and y or:

X and Y and Z -- legal 
    X and Y or Z -- ILLEGAL 
    (X and Y) or Z -- legal 
    X and (Y or Z) -- legal