我的程序中有以下工作存储变量。
01 W-WRK.
02 W-MNTH-THRSHLD PIC S9(04).
我使用以下COMPUTE函数来否定W-MNTH-THRSHLD的值。
COMPUTE W-MNTH-THRSHLD OF W-WRK =
W-MNTH-THRSHLD OF W-WRK * -1.
我想知道这种方法是否正确,或者是否有其他选择?
答案 0 :(得分:2)
首先,你为什么要使用资格(OF
)?只有在您定义了重复名称时才需要这样做。为什么在WORKING-STORAGE中定义重复的名称?
其次,除非您使用的是非常旧的COBOL编译器,否则您应该只使用PROCEDURE DIVISION
中所需的最小句点/句点。也就是说,一个终止段落/ SECTION标签,一个终止段落/ SECTION。一个终止PROCEDURE DIVISION标头。一个终止一个程序(如果一个完整的停止/周期不存在。保持额外的全停/周期使得复制代码更加困难。将整个停止/周期放在自己的一行上,所以没有代码行有一个,那么你不能通过将一行代码复制到一个范围内而不小心终止一个范围。
考虑到这些,您的代码将成为:
COMPUTE W-MNTH-THRSHLD = W-MNTH-THRSHLD
* -1
乘法比减法慢。正如布鲁斯马丁所说:
COMPUTE W-MNTH-THRSHLD = 0
- W-MNTH-THRSHLD
我这样做:
SUBTRACT W-MNTH-THRSHLD FROM 0
GIVING W-MNTH-THRSHLD-REV-SIGN
我不喜欢“摧毁”一个价值只是为了它。如果程序失败,我知道W-MNTH-THRSHLD包含什么,加上目标字段的有意义的名称解释了该行的作用。
你也可以DIVIDE
(或者在COMPUTE中/
),但这甚至比MULTIPLY(或*
)慢。
另请注意,可能需要进行转换,因为您正在使用USAGE DISPLAY字段进行算术运算。如果您将字段定义为BINARY
或PACKED-DECIMAL
,则转化的可能性较小。除非您的编译器可以在算术中处理USAGE DISPLAY而不需要转换,否则您不会因此而失败。
另请注意,COMPUTE不是一个功能。 COMPUTE是一个动词,只是语言的一部分。 “我正在使用COMPUTE”已经足够,甚至没有必要,因为我们可以从代码中看到它。