6.8 CONTINUE和NEXT SENTENCE语句

短语NEXT SENTENCE语句表示要跳到下一个句号(.)后面的语句,而不是紧跟在NEXT SENTENCE语句后面的语句,这是很多程序员最容易想当然出现的错误。在下面的例子中,当SEX既不是‘F’也不是‘M’时,程序并不会像程序员想象的那样,帮你累加GRADE为A的人员合计数,而会直接执行第33行的DISPLAY语句,因为句号出现在第34行的END-IF的后面,NEXT SENTENCE总是跳去执行最近的句号(.)后面的下一条语句。

语句CONTINUE用来指定一个空操作,即什么也不做,但会将控制转到紧靠着CONTINUE语句的下一条语句而不是转到下一个句号(.)后面的语句去执行,这就是它与NEXT SENTENCE语句的最大区别。实际上,在我们的程序设计规范中,要求程序员不要使用NEXT SENTENCE语句,因为它可能误导你去错误的地方。我们建议在程序中使用CONTINUE语句,因为它更接近于我们所说的“下一条语句”。

下面的例子证实了我们对这两条语句的理解,第29行的NEXT SENTENCE并没有跳到第32行去执行,而是直接执行了第1个句号(第34行的END-IF)之后的第35行的DISPLAY语句,这在报表的第1行得到了验证。

第44行的CONTINUE语句则是跳到了紧跟在IF语句之后的第47行的DISPLAY语句和随后的ADD语句,这样就会有报表的第2行和第3行的结果。

6.8.1 程序例子(CONTINUE和NEXT SENTENCE语句)

        000001  IDENTIFICATION DIVISION.
        000002 *
        000003  PROGRAM-ID. CONTINU1.
        000004  AUTHOR. NEWMAN LV.
        000005 *
        000006  ENVIRONMENT DIVISION.
        000007 *
        000008  INPUT-OUTPUT SECTION.
        000009 *
        000010  DATA DIVISION.
        000011 *
        000012
        000013  FILE SECTION.
        000014 *
        000015  WORKING-STORAGE SECTION.
        000016  77  WS-GRADE          PIC X(01) VALUE 'A'.
        000017  77  WS-SEX            PIC X(01) VALUE SPACE.
        000018  77  WS-TOTAL-A        PIC 9(02) VALUE 0.
        000019 *
        000020  PROCEDURE DIVISION.
        000021     MOVE ZERO          TO WS-TOTAL-A
        000022     IF WS-GRADE = 'A'
        000023        IF WS-SEX  = 'M'
        000024          DISPLAY 'MAN - CLASS A'
        000025        ELSE
        000026          IF WS-SEX = 'F'
        000027             DISPLAY 'WOMEN - CLASS A'
        000028          ELSE
        000029            NEXT SENTENCE
        000030          END-IF
        000031        END-IF
        000032        DISPLAY '***NEXT SENTENCE IS NOT HERE!!!'
        000033        ADD 1 TO WS-TOTAL-A
        000034     END-IF.
        000035     DISPLAY 'NEXT SENTENCE, WS-TOTAL-A IS:' WS-TOTAL-A
        000036 *
        000037     IF WS-GRADE = 'A'
        000038        IF WS-SEX  = 'M'
        000039          DISPLAY 'MAN - CLASS A'
        000040        ELSE
        000041          IF WS-SEX = 'F'
        000042             DISPLAY 'WOMEN - CLASS A'
        000043          ELSE
        000044            CONTINUE
        000045          END-IF
        000046        END-IF
        000047        DISPLAY '***CONTINUE IS HERE!!!'
        000048        ADD 1 TO WS-TOTAL-A
        000049     END-IF
        000050     DISPLAY 'CONTINUE, WS-TOTAL-A IS:' WS-TOTAL-A
        000051 *
        000052      STOP RUN.

6.8.2 运行结果报表(CONTINUE和NEXT SENTENCE语句)

        000001 NEXT SENTENCE, WS-TOTAL-A IS:00
        000002 ***CONTINUE IS HERE!!!
        000003 CONTINUE, WS-TOTAL-A IS:01