2013-06-10 22 views
15

Sto imparando Ada correggendo bug e leggendo il codice. Ho notato alcune affermazioni con "e" e altre con "e poi". allo stesso modo, c'è "o" e in altri posti c'è "o altro". Un collega dice che è solo zucchero sintattico e non fa differenza. Mi chiedo se abbia ragione?Esiste una differenza tra "e" vs "e quindi" in un'istruzione IF

+0

+1 per chiedere :-) –

+0

risposta breve - Sì. – NWS

+3

NWS - una risposta più breve (e corretta) è No! –

risposta

19

In Ada and then e or else sono i cosiddetti 'cortocircuito' forme corrispondentemente and e or operatori:

operatori collegamento [and then, or else] sono usati per fare la valutazione delle parti di espressioni booleane condizionali. Questo non dovrebbe mai essere effettuato per accelerare la valutazione (con i moderni compilatori di ottimizzazione, sarà possibile che non abbia questo effetto). L'uso corretto consiste nel prevenire la valutazione delle espressioni nota per generare un'eccezione.

Esempio (presa, come la spiegazione di cui sopra, da wikibooks/Ada):

if Dog /= null and then G (Dog) then 
    Walk (Dog); 
end if; 

Qui G (cani) verrà valutato solo se cane non è nullo. Senza and then sarebbe comunque valutato, sollevando un'eccezione se Dog è effettivamente nullo.

Si noti che and then e or else sono, in senso stretto, non operatori, in quanto non possono essere sovraccaricati.

Suggerisco di leggere questo wikibook, ti aiuterà molto nel tuo viaggio attraverso Ada.)

+0

+1 per fornire il collegamento al wikibook - una risorsa molto utile – erict

2

Supponiamo che FuncB sia una funzione che restituisce Booleano che ha un effetto collaterale. In

if False and FuncB then 
    null; 
end if; 

l'effetto collaterale di FuncB verifica, mentre con la forma breve circuito

if False and then FuncB then 
    null; 
end if; 

l'effetto collaterale di FuncB non si verifica.

2

Il costrutto and then è una caratteristica che alcuni linguaggi di programmazione utilizzano chiamato cortocircuito.

È possibile verificare e comprendere questa funzionalità provando questi frammenti di codice:

x:=0; 
if false and 1/x=1 then 
    null; 
end if; 

Questo si tradurrà in una divisione per un'eccezione zero.

x:=0; 
if false and then 1/x=0 then 
    null; 
end if; 

Questo non genera un'eccezione, perché non controlla la seconda condizione.

+0

'false e [then] 1/x' ti darà un messaggio di errore in fase di compilazione, poiché' 1/x' non è di tipo 'Booleano '. –