operator or_else (operand1, operand2: Boolean) = Result: Boolean;
The or_else
short-circuit logical operator performs the same
operation as the logical operator or
. But while the ISO
standard does not specify anything about the evaluation of the
operands of or
– they may be evaluated in any order, or not
at all – or_else
has a well-defined behaviour: It evaluates
the first operand. If the result is True
, or_else
returns True
without evaluating the second operand. If it is
False
, the second operand is evaluated and returned.
GPC by default treats or
and or_else
exactly the same.
If you want, for some reason, to have both operands of or
evaluated completely, you must assign both to temporary variables
and then use or
– or or_else
, it does not matter.
or_else
is an ISO 10206 Extended Pascal extension.
Some people think that the ISO standard requires both operands of
or
to be evaluated. This is false. What the ISO standard
does say is that you cannot rely on a certain order of
evaluation of the operands of or
; in particular things like
the following program can crash according to ISO Pascal, although
they cannot crash when compiled with GNU Pascal running in default
mode.
program OrBug; var a: Integer; begin ReadLn (a); if (a = 0) or (100 div a > 42) then { This is *not* safe! } WriteLn ('You''re lucky. But the test could have crashed ...') end.
program Or_ElseDemo; var a: Integer; begin ReadLn (a); if (a = 0) or_else (100 div a > 42) then { This is safe. } WriteLn ('100 div a > 42') end.