Previous: Construct Names, Up: Control Statements

#### 8.10.4 The `CYCLE` and `EXIT` Statements

The `CYCLE` and `EXIT` statements specify that the remaining statements in the current iteration of a particular active (enclosing) `DO` loop are to be skipped.

`CYCLE` specifies that these statements are skipped, but the `END DO` statement that marks the end of the `DO` loop be executed—that is, the next iteration, if any, is to be started. If the statement marking the end of the `DO` loop is not `END DO`—in other words, if the loop is not a block `DO`—the `CYCLE` statement does not execute that statement, but does start the next iteration (if any).

`EXIT` specifies that the loop specified by the `DO` construct is terminated.

The `DO` loop affected by `CYCLE` and `EXIT` is the innermost enclosing `DO` loop when the following forms are used:

```     CYCLE
EXIT
```

Otherwise, the following forms specify the construct name of the pertinent `DO` loop:

```     CYCLE construct-name
EXIT construct-name
```

`CYCLE` and `EXIT` can be viewed as glorified `GO TO` statements. However, they cannot be easily thought of as `GO TO` statements in obscure cases involving FORTRAN 77 loops. For example:

```           DO 10 I = 1, 5
DO 10 J = 1, 5
IF (J .EQ. 5) EXIT
DO 10 K = 1, 5
IF (K .EQ. 3) CYCLE
10    PRINT *, 'I=', I, ' J=', J, ' K=', K
20    CONTINUE
```

In particular, neither the `EXIT` nor `CYCLE` statements above are equivalent to a `GO TO` statement to either label `10' or `20'.

To understand the effect of `CYCLE` and `EXIT` in the above fragment, it is helpful to first translate it to its equivalent using only block `DO` loops:

```           DO I = 1, 5
DO J = 1, 5
IF (J .EQ. 5) EXIT
DO K = 1, 5
IF (K .EQ. 3) CYCLE
10             PRINT *, 'I=', I, ' J=', J, ' K=', K
END DO
END DO
END DO
20    CONTINUE
```

Adding new labels allows translation of `CYCLE` and `EXIT` to `GO TO` so they may be more easily understood by programmers accustomed to FORTRAN coding:

```           DO I = 1, 5
DO J = 1, 5
IF (J .EQ. 5) GOTO 18
DO K = 1, 5
IF (K .EQ. 3) GO TO 12
10             PRINT *, 'I=', I, ' J=', J, ' K=', K
12          END DO
END DO
18    END DO
20    CONTINUE
```

Thus, the `CYCLE` statement in the innermost loop skips over the `PRINT` statement as it begins the next iteration of the loop, while the `EXIT` statement in the middle loop ends that loop but not the outermost loop.