在使用$ 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
?
答案 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的纠正变化?