【问题标题】:Dot rules in nested conditional statements - COBOL嵌套条件语句中的点规则 - COBOL
【发布时间】:2014-07-01 07:41:55
【问题描述】:

我想知道是否有人可以向我解释 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 相同吗?

【问题讨论】:

  • 您需要一个句号/句号来终止 PROCEDURE DIVISION 语句,您需要终止一个过程标签(段落/SECTION 名称),您需要一个终止过程(段落/SECTION)如果还没有,程序中的最后一件事应该是句号/句号。终止程序的那些我放在自己的单独行上,以便它们非常清晰和明显(正如@piet.t 所说,否则它们不是。然后,除了文字之外,没有其他句号/句号在 PROCEDURE DIVISION 中。对于终止在需要时,范围终止符。
  • @BillWoodger;除了讨厌的 END-EXEC 和眼睛强制期,总是在那里,分散注意力,看起来像一个流浪者。布拉格。 :-)

标签: cobol nested-if placement


【解决方案1】:

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

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

只在语法规则严格要求的地方加上句号,别处。使用明确的范围终止符,例如 END-IFEND-PERFORM。它们使您的代码更具可读性和结构清晰,而句点由于多个闭包及其隐藏在普通视图中的习惯而容易产生混乱。

【讨论】:

  • 这是正确的答案,甚至更正确(如果可能的话)说 COBOL 中的句点是邪恶的!
  • 我一直喜欢有一个 '.'在退出语句之前的一行上。在主机上 x all;f '.' all 将向您显示所有带有 '.' 的行。就在上面
  • 没错,句号带你回到最顶层,结束所有的 IF、PERFORM 等。我只提到了 IF,因为这是原始示例使用的;我应该提到这个时期的“完全”停止。
【解决方案2】:

句点字符“.”结束所有 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
     .

【讨论】:

  • 从原始缩进来看,READ 应该是无条件的 :-)
  • 我明白了。所以就我的代码而言,READ 语句属于第二个 IF 语句。我实际上只需要这个确认。非常感谢!
  • @blazaphyrocqua 根据编译器是这样的。从代码中猜测(虽然它是粗制滥造的)我会说这不是人类作者所期望的。如果您使用该代码运行,我认为您会遇到问题,但是没有看到更多,当然不能确定:-)
【解决方案3】:

这真的很糟糕,很古老的 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 语句与 PERFORM 语句处于同一逻辑级别,因此我会将它们缩进相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多