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
Odpowiedz
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ę.)
+1 za podanie linku do wikibook - najbardziej przydatny zasób – erict
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.
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.
'false i [then] 1/x' daje komunikat o błędzie podczas kompilacji, ponieważ' 1/x' nie jest typu 'Boolean '. –
+1 za pytanie :-) –
krótka odpowiedź - Tak. – NWS
NWS - krótsza (i poprawna) odpowiedź brzmi Nie! –