嵌套条件语句中的点规则-COBOL

嵌套条件语句中的点规则-COBOL,cobol,nested-if,placement,Cobol,Nested If,Placement,我想知道是否有人能向我解释一下COBOL中嵌套if语句中的点规则。例如: *The first if statement* IF SUCCESSFUL-STATUS PERFORM 8300-REPL-LNNTBI00 THRU 8300-REPL-LNNTBI00-EXIT *The second if statement* IF SUCCESSFUL-STATUS DISPLAY 'RECORD ALREADY UP

我想知道是否有人能向我解释一下COBOL中嵌套if语句中的点规则。例如:

*The first if statement*
 IF SUCCESSFUL-STATUS 
     PERFORM 8300-REPL-LNNTBI00 
        THRU 8300-REPL-LNNTBI00-EXIT 
*The second if statement*
        IF SUCCESSFUL-STATUS 
            DISPLAY 'RECORD ALREADY UPDATED :' WS-INF-REC
        ELSE 
            DISPLAY 'UPDATE ERROR : ' WS-INF-REC ' / ' 
            WS-RETURN-STATUS 
 READ INFILE INTO WS-INF-REC.   

“WS-INF-REC”后面的点属于哪个if语句?第一个IF还是第二个IF-ELSE?我知道在大多数编程中,它应该是最后一个if语句,但只是为了确保,COBOL也是一样的吗?

AFAIR一个句点总是关闭所有前面的语句-无论它们是
if
PERFORM
还是其他什么-因此在您的例子中,第一个
if
-语句也是关闭的。由于周期很小,很容易被忽略,我使用以下规则:

避免使用句号,它们是邪恶的


只在语法规则严格要求的地方放置句点,而不在其他地方。使用显式作用域终止符,如
END-IF
END-PERFORM
。它们使您的代码更具可读性和结构更清晰,而句点由于多个闭包以及它们隐藏在普通视图中的习惯而容易产生混乱

AFAIR一个句点总是关闭前面的所有语句-无论它们是
IF
PERFORM
还是其他语句-因此在您的情况下,第一个
IF
-语句也会关闭。由于周期很小,很容易被忽略,我使用以下规则:

避免使用句号,它们是邪恶的


只在语法规则严格要求的地方放置句点,而不在其他地方。使用显式作用域终止符,如
END-IF
END-PERFORM
。它们使您的代码更具可读性和结构更清晰,而句点由于多个闭包以及它们隐藏在普通视图中的习惯而容易产生混乱

这真的很糟糕,非常古老的Cobol,但它的行为是这样的:

*The first if statement*
IF SUCCESSFUL-STATUS 
    PERFORM 8300-REPL-LNNTBI00 
       THRU 8300-REPL-LNNTBI00-EXIT 
*The second if statement*
    IF SUCCESSFUL-STATUS 
        DISPLAY 'RECORD ALREADY UPDATED :' WS-INF-REC
    ELSE 
        DISPLAY 'UPDATE ERROR : ' WS-INF-REC ' / ' WS-RETURN-STATUS 
        READ INFILE INTO WS-INF-REC
    END-IF ## from period
 END-IF ## from period

这真的很糟糕,非常古老的Cobol,但它的行为是这样的:

*The first if statement*
IF SUCCESSFUL-STATUS 
    PERFORM 8300-REPL-LNNTBI00 
       THRU 8300-REPL-LNNTBI00-EXIT 
*The second if statement*
    IF SUCCESSFUL-STATUS 
        DISPLAY 'RECORD ALREADY UPDATED :' WS-INF-REC
    ELSE 
        DISPLAY 'UPDATE ERROR : ' WS-INF-REC ' / ' WS-RETURN-STATUS 
        READ INFILE INTO WS-INF-REC
    END-IF ## from period
 END-IF ## from period
句点字符“.”结束所有if语句。请记住,编译器会忽略间距,因此READ语句是第二个IF语句ELSE的一部分

我们人类希望看到缩进的逻辑使用。如果是我的话,我会做出明确的结局。我倾向于每个段落有一个句号:

* The first if statement *
     IF SUCCESSFUL-STATUS 
       PERFORM 8300-REPL-LNNTBI00 
         THRU 8300-REPL-LNNTBI00-EXIT 
* The second if statement*
       IF SUCCESSFUL-STATUS 
         DISPLAY 'RECORD ALREADY UPDATED :' WS-INF-REC
       ELSE 
         DISPLAY 'UPDATE ERROR : ' WS-INF-REC ' / ' 
           WS-RETURN-STATUS 
         READ INFILE INTO WS-INF-REC
       END-IF
     END-IF
     .
句点字符“.”结束所有if语句。请记住,编译器会忽略间距,因此READ语句是第二个IF语句ELSE的一部分

我们人类希望看到缩进的逻辑使用。如果是我的话,我会做出明确的结局。我倾向于每个段落有一个句号:

* The first if statement *
     IF SUCCESSFUL-STATUS 
       PERFORM 8300-REPL-LNNTBI00 
         THRU 8300-REPL-LNNTBI00-EXIT 
* The second if statement*
       IF SUCCESSFUL-STATUS 
         DISPLAY 'RECORD ALREADY UPDATED :' WS-INF-REC
       ELSE 
         DISPLAY 'UPDATE ERROR : ' WS-INF-REC ' / ' 
           WS-RETURN-STATUS 
         READ INFILE INTO WS-INF-REC
       END-IF
     END-IF
     .


您需要一个句号/句号来终止过程分割语句,您需要打开来终止过程标签(段落/章节名称),您需要一个句号来终止过程(段落/章节),如果还没有,程序中的最后一件事应该是句号/句号。那些终止一个程序的,我把它们放在自己的一行上,这样它们就非常清楚和明显了(正如@piet.t所说,否则就不是了。那么,除了文字,程序部分没有其他句号/句号。如果需要终止,请使用范围终止符。请查看:@BillWoodger;除了讨厌的末端执行官和“眼睛硬”强制句号,始终在那里,分散注意力,看起来可疑地像一个流浪汉。Blarg.-)您需要一个句号/句号来终止程序划分语句,您需要一个on来终止程序标签(段落/章节名称),您需要一个on来终止程序(段落/章节)如果还没有,程序中的最后一件事应该是一个句号/句号。我把终止程序的那些放在它们自己的单独一行上,这样它们就非常清楚和明显了(正如@piet.t所说,否则就不是了。那么,除了文字,程序部分没有其他句号/句号。如果需要终止,请使用范围终止符。请查看:@BillWoodger;除了讨厌的末端执行官和“眼睛硬”强制句号,始终在那里,分散注意力,看起来可疑地像一个流浪汉。Blarg.-)这是正确的答案,甚至更正确(如果可能的话)因为在COBOL中说句号是邪恶的!我总是喜欢在exit语句之前的一行上有一个“.”。在大型机x all;f“.”上,all将显示所有带有“.”的行。事实上,句号将使您返回到最高级别,结束所有的IFs、执行等。我只提到IFs,因为这是原始示例中使用的g、 我应该提到这段时间的“句号”。这是正确的答案,甚至更正确(如果可能的话)因为在COBOL中说句号是邪恶的!我总是喜欢在exit语句之前的一行上有一个“.”。在大型机x all;f“.”上,all将显示所有带有“.”的行。事实上,句号将使您返回到最高级别,结束所有的IFs、执行等。我只提到IFs,因为这是原始示例中使用的g、 我应该提到“完整的”句点的停止时间。由于第二个IF语句与PERFORM语句处于相同的逻辑级别,我将对它们进行相同的缩进。由于第二个IF语句与PERFORM语句处于相同的逻辑级别,我将对它们进行相同的缩进。从原始缩进中,读取应该是无条件的:-)我明白了。所以在我的代码中,READ语句属于第二个IF语句。我实际上只需要这个确认。非常感谢!@blazaphyrocqua根据编译器的说法是这样的。从代码中猜测(尽管它是劣质的)我得说这不是人类作者所期望的。我想如果你用那段代码运行,你会有问题,但是没有看到更多,当然不能确定:-)从原始缩进来看,读取应该是无条件的:-)我明白了。。在我的代码中,READ语句属于第二个IF语句。实际上我只需要这个确认。谢谢!