COBOL将0添加到COMPUTE中的变量

时间:2011-12-14 21:36:29

标签: db2 cobol zos

在使用$ WORK工作COBOL程序时,我遇到了一个奇怪的声明。

我们有一个段落打开一个游标(来自DB2),并在它上面循环直到它到达EOT(在伪代码中):

... working storage ...
01  I                       PIC S9(9) COMP VALUE ZEROS.
01  WS-SUB                  PIC S9(4) COMP VALUE 0.

... code area ...
PARA-ONE.                                                
    PERFORM OPEN-CURSOR
    PERFORM FETCH-CURSOR

    PERFORM VARYING I FROM 1 BY 1 UNTIL SQLCODE = DB2EOT                        
        do stuff here...
    END-PERFORM                                           

    COMPUTE WS-SUB = I + 0                            
    PERFORM CLOSE-CURSOR

    ... do another loop using WS-SUB ...

我想知道为什么COMPUTE WS-SUB = I + 0行存在。我的理解是I总是至少是1,因为它上面的执行块(即,即使有一个EOT开始,I也将被设置为1在那个初始迭代)。

是否需要COMPUTE行?它是否正在做一些我不知道的隐式演员?它为什么会在那里?你为什么不只是MOVE I TO WS-SUB

2 个答案:

答案 0 :(得分:6)

称之为愚蠢,但有一些编译器(有效的正确选项),给定

 01  SIGNED-NUMBER   PIC S99 COMP-5 VALUE -1.
 01  UNSIGNED-NUMBER PIC  99 COMP-5.
      ... 
      MOVE SIGNED-NUMBER TO UNSIGNED-NUMBER
      DISPLAY UNSIGNED-NUMBER

结果:255。但是......

COMPUTE UNSIGNED-NUMBER = SIGNED-NUMBER + ZERO

结果为:1(无符号)

因此,为了回答您的问题,这可以被归类为使用将签名数字转换为无符号数字的技术。但是,在代码示例中,您完全没有任何意义。

答案 1 :(得分:0)

我想知道源的测试版本是否有

COMPUTE WS-SUB = I + 0
    ON SIZE ERROR
        DISPLAY "WS-SUB overflow"
        STOP RUN
END-COMPUTE

当开发人员满意并清理时,范围测试被丢弃了吗? MOVE不允许声明性的SIZE语句。这就是我能看到的原因。或者也许是开发人员使用COMPUTE移动的习惯,作为一个微妙的提示来质疑每一步都需要防御性代码?也许不知道,正如Joe指出的那样,SIZE条款在没有+ 0的情况下同样有效吗?或者一位维护人员因为一次错误而挣扎,并且在测试之后有一次从1到0的纠正变化?