GO TO如何控制COBOL中的流量工作?

时间:2014-10-31 10:38:36

标签: ibm-midrange cobol

PROCEDURE DIVISION
MAINPARA
    DISPLAY "HELLO MAIN".
    GO TO PARA1.
    DISPLAY " SECOND DISPLAY".
    STOP RUN.

PARA1.
    DISPLAY " I AM IN PARA1".

PARA2.
    DISPLAY "I AM IN PARA2"
....
PARA200

我对流程了解不多。但是,我很困惑。当控件跳转到GO TO PARA1时,它将执行PARA1

现在我的问题是:

  1. 是否会执行PARA2并返回MAINPARA
  2. 或者它会从PARA2执行到程序结束吗?
  3. 我不是COBOL程序员,我需要了解迁移工具/进程AMXW COBOL的代码。目标系统是IBM AS / 400。

5 个答案:

答案 0 :(得分:6)

您的程序将显示:

HELLO MAIN
 I AM IN PARA1
I AM IN PARA2
...

因为GO TO移动了程序的执行点。然后它顺序执行,从那里移动到

如果用GO TO动词替换PERFORM动词,则在此对话框中,程序:

PROCEDURE DIVISION
MAINPARA
    DISPLAY "HELLO MAIN".
    PERFORM PARA1.
    DISPLAY " SECOND DISPLAY".
    STOP RUN.

PARA1.
    DISPLAY " I AM IN PARA1".

PARA2.
    DISPLAY "I AM IN PARA2"
....
PARA200

会显示:

HELLO MAIN
 I AM IN PARA1
SECOND DISPLAY

答案 1 :(得分:5)

GO TO语句永久将执行从程序的一个部分转移到程序的另一部分。在GO TO PARA1之后,执行将跳转到PARA1标签,执行以下段落,然后从那里继续。

<强>输出:

HELLO MAIN
 I AM IN PARA1
I AM IN PARA2
.
.
I AM IN PARA200

因此,执行将继续,直到遇到STOP RUN语句或运行时错误

注意: GO TO语句通常被视为不良做法。跟踪GO TO语句可以说的位置变得更加困难。我建议改用PERFORM。它将控制返回到执行过程后的位置。

答案 2 :(得分:2)

GO TO转移控制标记的para和control不回来。 所以,你的输出将是:

HELLO MAIN
 I AM IN PARA1
I AM IN PARA2
...

答案 3 :(得分:1)

正如@Tamer Tas指出的那样,CO TO中的GO TO将控制转移到指定的标签,即GO TO中指定的段落或部分。在您在问题中提供的代码中,输出将是

HELLO MAIN
 I AM IN PARA1
I AM IN PARA2

等等,直到遇到GOBACK或STOP RUN。如果没有遇到这些问题,您的程序将以不可预测的方式终止。

强烈劝阻GO TO;即便如此,你会看到现代代码中使用的GO TO。一个人为的代码示例......

    [...]
    Perform 100-DO-IT Through 100-DO-IT-EXIT
    [...]
    GOBACK.

100-DO-IT.
    If A < B 
        GO TO 100-DO-IT-EXIT
    End-If

    Compute C = A - B
    .

100-DO-IT-EXIT.
    Exit.

显然,If语句是微不足道的,可以通过将100-EDIT之外的If移动到那里转移控制的Perform来避免GO TO。当控制逻辑很复杂时,程序员必须问自己,如果推动这个控制逻辑,代码中的“向上”或“向下”是多少。

这种特殊的编码风格有其支持者;我不是其中之一。

答案 4 :(得分:1)

COBOL中的GO TO与C中的GO TO相同。

在您的示例中,GO TO将处理顺序所有指令,直到程序结束。

如果您希望它只执行PARA1,您可以使用PERFORM PARA1语句。 如果您想要执行更多段落,但直到程序结束,您可以使用PERFORM THRU构造。通过使用perform,程序将在段落执行后返回。

另外,请记住,在许多地方(公司环境),您不能使用GO TO,因为它会产生许多难以理解的代码。此外,无限循环的可能性相当大。