如何否定一个变量?

How to negate a variable?

我的程序中有以下工作存储变量。

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.

我想知道这种方法是否正确,或者是否有其他替代方法?

首先,你为什么要使用资格(OF)?仅当您定义了重复名称时才需要这样做。为什么在 WORKING-STORAGE?

中定义重复名称

其次,除非您使用的是非常古老的 COBOL 编译器,否则您应该只使用 PROCEDURE DIVISION 中所需的最小值 full-stops/periods。即,一个终止paragraph/SECTION标签,一个终止paragraph/SECTION标签。一个终止 PROCEDURE DIVISION header。一个用于终止程序(如果 full-stop/period 不存在。保留额外的 full-stops/periods 会使复制代码变得更加困难。将 full-stop/period 单独放在一行,所以没有一行代码有一个,那么你不能通过将带有 full-stop/period 的代码行复制到范围内来意外终止范围。

考虑到这些,您的代码将变为:

       COMPUTE W-MNTH-THRSHLD       = W-MNTH-THRSHLD 
                                    * -1

乘法比减法慢。正如 Bruce Martin 建议的那样:

       COMPUTE W-MNTH-THRSHLD       = 0 
                                    - W-MNTH-THRSHLD

我是这样做的:

       SUBTRACT W-MNTH-THRSHLD      FROM 0 
         GIVING                     W-MNTH-THRSHLD-REV-SIGN

我不喜欢 "destroying" 一个纯粹为了它而存在的值。如果程序失败,我知道 W-MNTH-THRSHLD 包含什么,加上目标字段的有意义的名称解释了该行的作用。

您也可以 DIVIDE(或 / 在 COMPUTE 中),但这甚至比 MULTIPLY(或 *)慢。

另请记住,可能需要进行转换,因为您正在使用 USAGE DISPLAY 字段进行算术运算。如果您将字段定义为 BINARYPACKED-DECIMAL,转换不太可能用于算术。这样做不会有任何损失,除非您的编译器可以在不需要转换的情况下处理算术中的 USAGE DISPLAY。

另请注意,COMPUTE 不是函数。 COMPUTE是一个动词,只是语言的一部分。 "I am using COMPUTE" 就足够了,甚至没有必要,正如我们从代码中看到的那样。