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
risposta
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.)
+1 per fornire il collegamento al wikibook - una risorsa molto utile – erict
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.
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.
'false e [then] 1/x' ti darà un messaggio di errore in fase di compilazione, poiché' 1/x' non è di tipo 'Booleano '. –
+1 per chiedere :-) –
risposta breve - Sì. – NWS
NWS - una risposta più breve (e corretta) è No! –