Ibm midrange 在COBOL中如何控制流?

Ibm midrange 在COBOL中如何控制流?,ibm-midrange,cobol,Ibm Midrange,Cobol,我不太了解流程。但是,我很困惑。当控件跳转到转到PARA1时,它将执行PARA1 现在我的问题是: 它将执行PARA2并返回到MAINPARA 或者它会在程序结束时从PARA2执行吗 我不是COBOL程序员,我需要理解来自迁移工具/过程AMXW COBOL的代码。目标系统是IBM AS/400。转到语句永久地将执行从程序的一部分转移到另一部分。在转到PARA1后,执行将跳转到PARA1标签,执行以下段落,然后从那里继续 输出: PROCEDURE DIVISION MAINPARA DI

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

现在我的问题是:

  • 它将执行
    PARA2
    并返回到
    MAINPARA
  • 或者它会在程序结束时从
    PARA2
    执行吗

  • 我不是COBOL程序员,我需要理解来自迁移工具/过程AMXW COBOL的代码。目标系统是IBM AS/400。

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

    输出:

    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
    
    因此,执行将继续,直到遇到
    停止运行
    语句或运行时错误


    注意:
    转到
    语句通常被认为是不好的做法,这是有原因的。可以说,跟踪
    转到哪里
    语句变得更加困难。我建议改为使用
    PERFORM
    。执行过程后,将控制权返回到原来的位置。

    您的程序将显示:

    HELLO MAIN
     I AM IN PARA1
    I AM IN PARA2
    .
    .
    I AM IN PARA200
    
    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
    I AM IN PARA2
    ...
    
    将显示:

    HELLO MAIN
     I AM IN PARA1
    I AM IN PARA2
    .
    .
    I AM IN PARA200
    
    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
    

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

    HELLO MAIN
     I AM IN PARA1
    SECOND DISPLAY
    
    依此类推,直到遇到回退或停止运行。如果两者都没有遇到,您的程序将以不可预知的方式终止

    去学校是强烈劝阻的;即使如此,您也会看到GO在现代代码中使用。一个人为的代码示例

    HELLO MAIN
     I AM IN PARA1
    I AM IN PARA2
    
    […]
    通过100-DO-IT-EXIT执行100-DO-IT
    [...]
    戈巴克。
    100-DO-IT。
    如果A
    显然,If语句很简单,可以通过将If移到100-EDIT之外的Perform来避免GO-TO。当控制逻辑很复杂时,程序员必须问自己,这个控制逻辑应该在代码中推到多高或多低


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

    COBOL中的
    转到
    与C中的
    转到
    相同

    在您的示例中,“转到”将按顺序处理所有指令,直到程序结束

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


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

    转到将控件转移到标记的段落,控件不会返回。 因此,您的输出将是:

        [...]
        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.
    

    事实上,它“继续从那里”正是为什么它是一个危险的指示,以避免尽可能多。不要说它会把你的代码变成意大利面条,这对机器来说很有效,但对人类来说却很难理解。这对“和一样”很好,而且它不仅适用于C语言。事实上,它也适用于几种语言。我提到了C,因为它是MyCopine中最为人所知的。对某人给你的卑鄙的反对票表示慰藉。对于将要遇到的使用示例来说,这很好(有很多方法不使用它,但人们仍然使用)。对某人给你的卑鄙的反对票表示慰藉。GO to的拼写与COBOL中的拼写不同。“你觉得你的答案在已经存在的问题上增加了什么?”BillWoodger我刚刚补充了我对答案的看法。有人无缘无故对这个问题的答案投了反对票。如果他们能停下来,改变他们的投票,那将是非常好的。(我35岁,当我开始编程时,每个人都做了一些基本的工作,所以当我看到
    GOTO
    时,我本能地知道它应该做什么。有趣的是,现在上网的人从来没有见过跳转指令,默认的假设是它应该像一个子程序一样工作。我对未来抱有希望!)