Controls execution of DO loop.
Syntax
[ construct-name :] DO [ label ] [ loop-control ] |
 |
- construct-name
is the name given to
the DO construct. If construct-name is specified, an END DO statement must appear at the end of the DO construct and have the same construct-name.
- label
is the label of an executable statement that terminates
the DO loop. If you specify label, you can terminate the DO loop either with an END DO statement or with an executable statement; the
terminating statement must include label. If you do not specify label, you must terminate the DO loop with the END DO statement.
- loop-control
is information used by
the DO statement to control the loop. It can take one of
the following forms:
index = init, limit [, step]
WHILE (logical-expression)
In the first form, index is a scalar variable of type integer or real; init, limit, and step are scalar expressions of type integer or real. In
the second form, logical-expression is a scalar logical expression. In the third form, loop-control is omitted. If you use the second or third form,
you must terminate the DO loop with the END DO statement.
Description
The syntax of the DO statement allows for the following types of DO loops:
Counter-controlled loop: a loop count
is calculated that controls the number of times the block is executed,
unless a prior exit occurs. A loop variable is incremented or decremented
after each execution.
While loop: a condition (logical-expression) is tested before each execution of the block; when
it is false, execution ceases. An exit may occur at any time.
Infinite loop: there is no loop-control; repeated execution of the block ceases only when an
exit from the loop occurs.
When label is present in the DO statement, it specifies the label of the terminating
statement of the DO loop. The terminating statement cannot be any of the following statements:
END, END IF, END SELECT, or END WHERE
Any nonexecutable statement
Note, however, that the terminating statement can be an IF (logical) or an END DO statement.
To maintain compatibility with some older versions of Fortran,
you can use the +onetrip compile-line option to ensure that every counter-controlled DO loop in the program executes at least once.
Extended-range DO loops
Extended-range DO loops—a compatibility extension—allow
a program to transfer control outside the DO loop’s range and then back into the DO loop. Extended-range DO loops work as follows: if a control statement
inside a DO loop transfers control to a statement outside
the DO loop, then any subsequent statement can transfer
control back into the body of the DO loop.
For example, in the following code, the range of the DO loop is extended to include the statement GOTO 20, which transfers control back to the body of the DO loop:
DO 50 i = 1, 10 20 n = n + 1 IF (n > 10) GOTO 60 50 CONTINUE ! normally, the range ends here 60 n = n + 100 ! this is the extended range, GOTO 20 ! which extends down to this line
|
Examples
The following DO construct displays the integers 1 through 10:
DO i = 1, 10 WRITE (*, *) i END DO |
The next example is a
FORTRAN 77-style DO loop that does the same as the preceding example:
DO 50 i = 1, 10 WRITE (*, *) i 50 CONTINUE |
The following DO construct iterates 5 times, decrementing the loop
index from 10 to 2:
The following is an example of a DO WHILE loop:
DO WHILE (sum < 100.0) sum = sum + get_num(unit) END DO |
The following example
illustrates the use of the EXIT statement to exit from a nested DO loop. The loops are named to control which loop
is exited. Note that loop-control is missing from both the inner and outer loops, which
therefore can be exited only by means of one of the EXIT statements:
outer:DO READ *, val new_val = 0 inner:DO new_val = new_val + proc_val(val) IF (new_val >= max_val) EXIT inner IF (new_val == 0) EXIT outer END DO inner END DO outer |
The next DO construct never executes:
Related statements
CONTINUE, CYCLE, END (construct), and EXIT
Related concepts
For related information, see the following: