.bp
.SH
9.  Statements
.LP
Except as indicated, statements are executed in sequence.
.SH
9.1  Expression statement
.LP
Most statements are expression statements, which have
the form
.SY
	expression \fG;
.ES
Usually expression statements are assignments or function
calls.
.SH
9.2  Compound statement, or block
.LP
So that several statements can be used where one is expected,
the compound statement (also, and equivalently, called `block') is provided:
.SY
	compound-statement:
		{ declaration-list\*(op statement-list\*(op }
.ES
.SY
	declaration-list:
		declaration
		declaration declaration-list
.ES
.SY
	statement-list:
		statement
		statement statement-list
.ES
If any of the identifiers
in the declaration-list were previously declared,
the outer declaration is pushed down for the duration of the block,
at which time it resumes its force.
.PP
Any initializations of
.Bd auto
or
.Bd register
variables are performed each time the block is entered at the top.
It is currently possible
(but a bad practice)
to transfer into a block;
in that case the initializations are not performed.
Initializations of
.Bd static
variables are performed only once when the program
begins execution.
Inside a block,
.Bd external
declarations do not reserve storage
so initialization is not permitted.
.SH
9.3  Conditional statement
.LP
The two forms of the conditional statement are
.SY
	\fGif ( \fIexpression \fG) \fIstatement
	\fGif ( \fIexpression \fG) \fIstatement \fGelse \fIstatement
.ES
In both cases the expression is evaluated
and if it is non-zero, the first substatement
is executed.
In the second case the second substatement is executed
if the expression is 0.
As usual the `else' ambiguity is resolved by connecting
an \fGelse\fR with the last encountered elseless \fGif\fR.
.SH
9.4  While statement
.LP
The \fGwhile\fR statement has the form
.SY
	\fGwhile ( \fIexpression \fG) \fIstatement
.ES
The substatement is executed repeatedly
so long as the value of the 
expression remains non-zero.
The test takes place before each execution of the
statement.
.SH
9.5  Do statement
.LP
The \fGdo\fR statement has the form
.SY
	\fGdo \fIstatement \fGwhile ( \fIexpression \fG) ;
.ES
The substatement is executed repeatedly until
the value of the expression becomes zero.
The test takes place after each execution of the
statement.
.SH
9.6  For statement
.LP
The \fGfor\fR statement has the form
.SY
.ft G
	for ( \fIexpression-1\*(op \fG; \fIexpression-2\*(op \fG ; \c
\fIexpression-3\*(op \fG) \fIstatement
.ES
This statement is equivalent to
.SY
	expression-1;
	\fGwhile (\fI\|expression-2\fG\|) {
		\fIstatement
		expression-3\|\fG;
	}
.ES
Thus the first expression specifies initialization
for the loop; the second specifies
a test, made before each iteration, such
that the loop is exited when the expression becomes
0;
the third expression typically specifies an incrementation
which is performed after each iteration.
.PP
Any or all of the expressions may be dropped.
A missing
expression-2
makes the
implied \fGwhile\fR clause equivalent to `while(\|1\|)';
other missing expressions are simply
dropped from the expansion above.
.SH
9.7  Switch statement
.LP
The \fGswitch\fR statement causes control to be transferred
to one of several statements depending on
the value of an expression.
It has the form
.SY
	\fGswitch ( \fIexpression \fG) \fIstatement
.ES
The usual arithmetic conversion is performed on the
expression, but the result must be
.Bd int.
The statement is typically compound.
Any statement within the statement
may be labelled with one or more case prefixes
as follows:
.SY
	\fGcase \fIconstant-expression \fG:
.ES
where the constant
expression
must be
.Bd int.
No two of the case constants in the same switch
may have the same value.
Constant expressions are precisely defined in \(sc15.
.PP
There may also be at most one statement prefix of the
form
.SY
	\fGdefault :
.ES
When the \fGswitch\fR statement is executed, its expression
is evaluated and compared with each case constant
If one of the case constants is
equal to the value of the expression,
control is passed to the statement
following the matched case prefix.
If no case constant matches the expression,
and if there is a \fGdefault\fR prefix, control
passes to the prefixed
statement.
If no case matches and if there is no
.Bd default
then
none of the statements in the
switch is executed.
.PP
.Bd Case
and
.Bd default
prefixes in themselves do not alter the flow of control,
which continues unimpeded across such prefixes.
To exit from a switch, see
.Bd break,
\(sc9.8.
.PP
Usually the statement that is the subject of a switch is compound.
Declarations may appear at the head of this
statement,
initializations of automatic or register variables
are ineffective.
.SH
9.8  Break statement
.LP
The statement
.SY
	\fGbreak ;
.ES
causes termination of the smallest enclosing \fGwhile\fR, \fGdo\fR,
\fGfor\fR, or \fGswitch\fR statement;
control passes to the
statement following the terminated statement.
.SH
9.9  Continue statement
.LP
The statement
.SY
	\fGcontinue ;
.ES
causes control to pass to the loop-continuation portion of the
smallest enclosing \fGwhile\fR,
\fGdo\fR, or \fGfor\fR
statement; that is to the end of the loop.
More precisely, in each of the statements
.SY
.ta .5i 2.5i 4.5i
	\fGwhile (\|\|.\|.\|.\|\|) {	do {	for (\|\|.\|.\|.\|\|) {
	  \|.\|.\|.\|	  \|.\|.\|.\|	  \|.\|.\|.\|
	contin:\|;	contin:\|;	contin:\|;
	}	} while (\|\|.\|.\|.\|\|)\|;	}
.RT
.ES
a \fGcontinue\fR is equivalent to `goto contin'.
(Following the `contin:' is a null statement, \(sc9.13.)
.SH
9.10  Return statement
.LP
A function returns to its caller by means of
the \fGreturn\fR statement, which has one of the
forms
.SY
.ft G
	return ;
	return \fIexpression \fG;
.ES
In the first case the returned value is undefined.
In the second case, the value of the expression
is returned to the caller
of the function.
If required, the expression is converted,
as if by assignment, to the type of the
function in which it appears.
Flowing off the end of a function is
equivalent to a return with no returned value.
.SH
9.11  Goto statement
.LP
Control may be transferred unconditionally by means of
the statement
.SY
.ft G
	goto \fIidentifier \fG;
.ES
The identifier must be a label
(\(sc9.12)
located in the current function.
Previous versions of C had an incompletely implemented
notion of label variable, which has been withdrawn.
.SH
9.12  Labelled statement
.LP
Any statement may be preceded by
label prefixes of the form
.SY
	identifier \fG:
.ES
which serve to declare the identifier
as a label.
The only use of a label is as a target of a
.Bd goto.
The scope of a label is the current function,
excluding any sub-blocks in which the same identifier has been redeclared.
See \(sc11.
.SH
9.13  Null statement
.LP
The null statement has the form
.SY
	\fG;
.ES
A null statement is useful to carry a label just before the `}'
of a compound statement or to supply a null
body to a looping statement such as \fGwhile\fR.
