Operatorami short circuit nazywamy takie, które nie są obliczane jeśli nie jest to konieczne. Inną nazwą jest tego rodzaju jest wartościowanie leniwe.
W Adzie występują następujące konstrukcje:
- A or B
- Obliczane jest A
- Jeśli A jest prawdziwe, obliczane jest B. Niezależnie od wyniku B, wynik wyrażenia to "prawda".
o Jeśli A jest fałszywe, obliczane jest B. Jeśli B jest prawdziwe, wynik to "prawda", w przeciwnym razie "fałsz".
- A or else B
- Obliczane jest A
- Jeśli A jest prawdziwe, wynik to "prawda", a B nie jest obliczane.
- Jeśli A jest fałszywe, obliczane jest B. Jeśli B jest prawdziwe, wynik to "prawda", w przeciwnym razie "fałsz".
- A and B
- Obliczane jest A
- Jeśli A jest prawdziwe, obliczane jest B. Jeśli B jest też prawdziwe, wynik to prawda, w przeciwnym razie fałsz.
- Jeśli A jest fałszywe, to niezależnie od wyniku B, wynik wyrażenia to fałsz.
- A and then B
- Obliczane jest A
- Jeśli A jest prawdziwe, obliczane jest B. Jeśli B jest też prawdziwe, wynik to "prawda", w przeciwnym razie "fałsz".
- Jeśli A jest fałszywe, wynik to "fałsz", a B nie jest obliczane.
Przykład ("short_circuit.adb"):
with Text_IO, Ada.Integer_Text_IO;
use Text_IO, Ada.Integer_Text_IO;
procedure Short_Circuit is
function Is_Odd (i : Integer) return Boolean
is
begin
Put ("Testing");
Put (i);
New_Line;
return ((i / 2) * 2) /= i;
end;
begin
Put_Line ("Testing if ""5 and 6"" are odd");
if (Is_Odd (5) and Is_Odd (6)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""5 or 6"" are odd");
if (Is_Odd (5) or Is_Odd (6)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""5 and then 6"" are odd");
if (Is_Odd (5) and then Is_Odd (6)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""5 or else 6"" are odd");
if (Is_Odd (5) or else Is_Odd (6)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""6 and 5"" are odd");
if (Is_Odd (6) and Is_Odd (5)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""6 or 5"" are odd");
if (Is_Odd (6) or Is_Odd (5)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""6 and then 5"" are odd");
if (Is_Odd (6) and then Is_Odd (5)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
Put_Line ("Testing if ""6 or else 5"" are odd");
if (Is_Odd (6) or else Is_Odd (5)) then
Put_Line ("True");
else
Put_Line ("False");
end if;
end Short_Circuit;
W przykładzie widać też użycie podwójnego znaku "" dla zaznaczenia " w łańcuchu. Umożliwia to obycie się bez skomplikowanych i podatnych na błędy zasad escape'owania znaków. W C taka składnia byłaby niemożliwa ponieważ C pozwala napisać "łańcuch 1" "łańcuch 2" (z rozdzielającymi spacjami lub bez), co oznacza to samo co "łańcuch 1łańcuch 2" i jest przydatne w preprocessingu. Ale co ważniejsze Ada nie ma innych użytecznych znaków specjalnych - \n, \t, \e itd.