2013-06-10 8 views
15

Uczę się Ada, naprawiając błędy i odczytując kod. Zauważyłem, że niektóre stwierdzenia są wymieniane z "i", a inne z "a potem". podobnie jest "lub" i inne miejsca tam "lub inaczej". Współpracownik mówi, że to po prostu cukier syntaktyczny i nie robi różnicy. Zastanawiam się, czy on ma rację?Czy istnieje różnica między "i" kontra ", a następnie" w instrukcji IF

+0

+1 za pytanie :-) –

+0

krótka odpowiedź - Tak. – NWS

+3

NWS - krótsza (i poprawna) odpowiedź brzmi Nie! –

Odpowiedz

19

W Ada and then i or else są tak zwane „zwarcia” formy odpowiednio, and i or Operatorzy:

operatorzy Skróty [and then, or else] są wykorzystywane do oceny częściach wyrażenia boolowskie warunkowe. Nigdy nie powinno się tego robić , aby przyspieszyć ocenę (dzięki nowoczesnym kompilatorom optymalizującym, może to nie być możliwe). Poprawnym zastosowaniem jest zapobieganie ocenie wyrażeń, o których wiadomo, że powodują wyjątek.

Przykład (brane jako wyjaśnienie powyżej, z wikibooks/Ada)

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

tu G (pies) będą oceniane tylko jeżelipsa nie jest zerowy. Bez wartości and then byłaby ona jednak poddana ewaluacji, podnosząc wyjątek, jeśli Dog rzeczywiście ma wartość zerową.

Należy pamiętać, że and then i or else nie są operatorami, ponieważ nie mogą być przeciążone.

Sugeruję przeczytanie tego wikibook, pomoże ci to w podróży przez Adę.)

+0

+1 za podanie linku do wikibook - najbardziej przydatny zasób – erict

2

Załóżmy, że FuncB jest funkcją zwracającą wartość logiczną, która ma efekt uboczny. W

if False and FuncB then 
    null; 
end if; 

skutkiem ubocznym FuncB stanie, podczas gdy w formie skróconej obwodu

if False and then FuncB then 
    null; 
end if; 

skutkiem ubocznym FuncB nie występuje.

2

Konstrukcja and then jest cechą, którą niektóre języki programowania nazywają zwarciem.

można przetestować i zrozumieć tę funkcję przez próby te fragmenty kodu:

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

Ten spowoduje dzielenie przez zero wyjątku.

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

Ten nie spowoduje wyjątku, ponieważ nie sprawdza drugiego warunku.

+0

'false i [then] 1/x' daje komunikat o błędzie podczas kompilacji, ponieważ' 1/x' nie jest typu 'Boolean '. –

Powiązane problemy