在使用$ 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 ...
Run Code Online (Sandbox Code Playgroud)
我想知道为什么那条COMPUTE WS-SUB = I + 0线在那里.我的理解是,I至少总是如此1,因为它上面的执行块(即,即使有一个EOT开始,I也会在初始迭代时设置为1).
这COMPUTE条线甚至需要吗?它是否正在做一些我不知道的隐式演员?它为什么会在那里?你为什么不MOVE I TO WS-SUB呢?
称之为愚蠢,但有一些编译器(有效的正确选项),给定
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
Run Code Online (Sandbox Code Playgroud)
结果:255.但......
COMPUTE UNSIGNED-NUMBER = SIGNED-NUMBER + ZERO
Run Code Online (Sandbox Code Playgroud)
结果:1(未签名)
因此,为了回答您的问题,可以将其归类为使用强制签名数字转换为无符号数字的技术.但是,在你给它的代码示例中根本没有任何意义.