The basic conditional structure is
if(<condition>)
<stmt1>
else
<stmt2>
A ``statement'' can be either an assignment, or a group of statements delimited by curly brackets.
The effect of the statement
if(c)
x := foo;
else
x := bar;
is exactly equivalent to
x := c ? foo : bar;
If x is assigned in the ``if'' part, but not assigned in the ``else'' part, then x is undefined when the condition is false. This means that x can take any value in its type. Similarly, if x is assigned in the ``else'' part, but not in the ``if'' part, then x is undefined when the condition is true. For example,
if(c)
x := foo;
else
y := bar;
is equivalent to
x := c ? foo : undefined;
y := c ? undefined : bar;
Mathematically, undefined is the set of all possible values.
If next(x) is assigned in one part of the conditional, but not the other, then
next(x) = x;
is the default. For example,
if(c)
next(x) := foo;
else
next(y) := bar;
is equivalent to
next(x) := c ? foo : x;
next(y) := c ? y : bar;
Conditionals are statements, and therefore can be nested inside conditionals. Groups of statements can also be nested inside conditionals. For example:
if(c)
{
x := foo;
if(d)
next(y) := bar;
else
next(z) := bar;
}
else
x := bar;
The ``else'' part may be omitted, although this is hazardous. It can result in an ambiguity as to which ``if'' a given ``else'' corresponds to, if there are nested conditionals. Care should be take to use curly braces to disambiguate. Thus, instead of:
if(c)
if(d)
<stmt>
else
<stmt>
the preferred usage is:
if(c){
if(d)
<stmt>
else
<stmt>
}
The effect of:
if(c)
<stmt>
is equivalent to:
if(c)
<stmt>
else {}