2011-06-05 9 views
10

cosa è il significato diAda moduli di controllo di cortocircuito

x AND THEN y AND z 

è esso

x AND THEN (y AND z) 

(y, z viene mai valutata se x è FALSE) o

(x AND THEN y) AND z 

(se x è FALSE, y viene saltato, ma è possibile che z venga valutato) in ada?

+3

GNAT rifiuterà compilare il primo esempio di messaggio di errore "operatori logici misti nell'espressione". – oenone

risposta

4

Gli operatori di cortocircuito hanno la stessa precedenza delle loro versioni rigorose.

+1

[AARM §4.5 (17.a)] (http://www.adaic.org/resources/add_content/standards/05aarm/html/AA-4-5.html) nota che la precedenza dettagliata è "implicita nella sintassi regole ", in questo caso [§4.4 Espressioni] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-4.html). – trashgod

+0

Questo non risponde alla domanda, poiché "AND" e "AND THEN" hanno la stessa precedenza e potrebbero essere valutati "allo stesso tempo", o dato che AND è commutativo, in un ordine arbitrario. * Data * la stessa precedenza, penso che la regola è che gli operatori a destra vengono valutati solo dopo che "... THEN" le operazioni alla loro sinistra sono state valutate, che non hanno determinato l'esito del sottordine della stessa precedenza. –

+1

@Ira Baxter: Non seguo. [§4.5 (8)] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-5.html) prosegue affermando che per "operatori dello stesso livello di precedenza, gli operatori sono associati ai loro operandi in ordine testuale da sinistra a destra. " Cos'altro è necessario? – trashgod

3

Come Mrab & Ira & spazzatura hanno detto che hanno pari pecedence, tuttavia ciò che non è stato fatto notare esplicitamente è che gli operatori "e poi" & "altrimenti" farà sì che l'espressione per tornare (valutazione finitura) non appena un risultato può essere determinato.

Per esempio (in pseudocodice):

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

maggior parte del tempo solo la prima funzione (Almost_always_true_fn) saranno valutati, e solo quando che restituisce false sarà costly_fn essere eseguiti.

Confronta questo con:

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

In questo caso sia Almost_always_true_fn() e costly_fn() sarà valutata.

NWS.

3

Sì, in (x AND THEN y) AND z, lo z sarà sempre valutato.

4

@ il commento di oenone menziona che GNAT rifiuta x AND THEN y AND z, ma non spiega perché. È vero, in un certo senso, che lo and e lo and then hanno la stessa precedenza, ma non è tutta la storia.

La grammatica per un'espressione è:

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

dove { FOO } indica zero o più occorrenze di FOO.

Questa grammatica è progettata specificamente per consentire a uno di questi operatori o moduli di controllo di essere concatenati in una singola espressione (X and Y and Z, A and then B and then C), ma di vietare il loro mixaggio. Quindi l'espressione nella domanda, x AND THEN y AND z, è illegale e la questione di cosa significa non si pone neppure. Il punto di questa regola è proprio quello di evitare la confusione in casi come questo.

Hai solo bisogno di scrivere (X and then Y) and Z o X and then (Y and Z), a seconda di ciò che si vuole fare.

Lo stesso vale per la miscelazione e andor:

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