COBOL求值语句中的OR运算符

COBOL求值语句中的OR运算符,cobol,Cobol,我想知道我是否可以这样使用OR运算符: EVALUATE TRUE WHEN (COD-USER NOT EQUAL TO 01) OR (COD-USER NOT EQUAL TO 02) ADD 1 TO CTN-ERROR WHEN ... END-EVALUATE 我认为使用IF可以工作,但我需要使用这个语句。我试着把括号放在不同的位置,但没有用 我也尝试过使用不同的句子,比如下面的句子,但我得到了一个无效的表达错误: COD-USER N

我想知道我是否可以这样使用OR运算符:

EVALUATE TRUE
    WHEN (COD-USER NOT EQUAL TO 01) OR (COD-USER NOT EQUAL TO 02)
        ADD 1 TO CTN-ERROR

    WHEN 
    ...

END-EVALUATE
我认为使用IF可以工作,但我需要使用这个语句。我试着把括号放在不同的位置,但没有用

我也尝试过使用不同的句子,比如下面的句子,但我得到了一个无效的表达错误:

COD-USER NOT EQUAL TO 01 OR 02

你问题的答案

我想知道我是否可以这样使用OR运算符:

EVALUATE TRUE
    WHEN (COD-USER NOT EQUAL TO 01) OR (COD-USER NOT EQUAL TO 02)
        ADD 1 TO CTN-ERROR

    WHEN 
    ...

END-EVALUATE
…是“是的”。但是

这是你想要的吗

[...]
    05  WS-COD-USER PIC 99 VALUE ZEROES.
        88  DONT-ADD-1-TO-CTN-ERROR VALUES 1, 2.
[...]
    MOVE COD-USER TO WS-COD-USER
    EVALUATE TRUE
      WHEN DONT-ADD-1-TO-CTN-ERROR
           CONTINUE
      WHEN OTHER
           ADD 1 TO CTN-ERROR
    END-EVALUATE
如果
COD-USER
为1,则不会将1添加到
CTN-ERROR
。如果
COD-USER
为2,则不会将1添加到
CTN-ERROR
。如果
COD-USER
为任何其他值,1将添加到
CTN-ERROR


我认为
COD-USER
FD
或抄本中。否则,您可以在其后面添加
88
-级别。

您的问题的答案

我想知道我是否可以这样使用OR运算符:

EVALUATE TRUE
    WHEN (COD-USER NOT EQUAL TO 01) OR (COD-USER NOT EQUAL TO 02)
        ADD 1 TO CTN-ERROR

    WHEN 
    ...

END-EVALUATE
…是“是的”。但是

这是你想要的吗

[...]
    05  WS-COD-USER PIC 99 VALUE ZEROES.
        88  DONT-ADD-1-TO-CTN-ERROR VALUES 1, 2.
[...]
    MOVE COD-USER TO WS-COD-USER
    EVALUATE TRUE
      WHEN DONT-ADD-1-TO-CTN-ERROR
           CONTINUE
      WHEN OTHER
           ADD 1 TO CTN-ERROR
    END-EVALUATE
如果
COD-USER
为1,则不会将1添加到
CTN-ERROR
。如果
COD-USER
为2,则不会将1添加到
CTN-ERROR
。如果
COD-USER
为任何其他值,1将添加到
CTN-ERROR


我认为
COD-USER
FD
或抄本中。否则,您可以在其后面添加
88
-级别。

在您的示例中,您将始终
将1添加到CTN-ERROR

不确定您希望您的另一个
何时成为
,或者当
COD-USER
为01且
COD-USER
为02时希望发生什么,但如果您希望您的代码仅在
COD-USER
为01或02时才执行,则可以尝试以下操作:

EVALUATE COD-USER
    WHEN 01
        DO-SOMETHING
    WHEN 02
        DO-SOMETHING-ELSE
    WHEN OTHER
        ADD 1 TO CTN-ERROR
END-EVALUATE


当您在01或02进行匹配时,这将执行任何您需要的操作,并且任何其他操作都会将1添加到您的计数。

在您的示例中,您将始终
将1添加到CTN-ERROR

不确定您希望您的另一个
何时成为
,或者当
COD-USER
为01且
COD-USER
为02时希望发生什么,但如果您希望您的代码仅在
COD-USER
为01或02时才执行,则可以尝试以下操作:

EVALUATE COD-USER
    WHEN 01
        DO-SOMETHING
    WHEN 02
        DO-SOMETHING-ELSE
    WHEN OTHER
        ADD 1 TO CTN-ERROR
END-EVALUATE


当您匹配01或02时,这将执行您需要的任何操作,其他任何操作都会将1添加到您的计数中。

是的,您可以使用或,但您编写代码的方式将始终是正确的,正如上面回答中所述。什么时候可以写两次,如下所示

EVALUATE TRUE
  WHEN COD-USER = 01
  WHEN COD-USER = 02
    CONTINUE
  WHEN OTHER
    ADD 1 TO CTN-ERROR
END-EVALUATE

在上述示例中,当COD-USER=01或COD-USER=02时,它将继续,并且对于所有其他条件,它将在CTN-ERROR中添加1

是,您可以使用或,但您编写代码的方式将始终为真,正如上面回答中所述。什么时候可以写两次,如下所示

EVALUATE TRUE
  WHEN COD-USER = 01
  WHEN COD-USER = 02
    CONTINUE
  WHEN OTHER
    ADD 1 TO CTN-ERROR
END-EVALUATE

在上面的示例中,当COD-USER=01或COD-USER=02时,它将继续,并且对于所有其他条件,它将本能地向CTN-ERROR添加1,我会说是,但在这种情况下,最好的做法是尝试。制作一个模拟的小程序,将COD-USER的值强制到不同的级别,用显示器运行它,然后看看会发生什么。@gazz0x2z好吧,我照你说的做了,它工作得很好。关键是主程序一直在OR子句的下一行给我一个错误,现在我正在检查WHEN语句中的所有代码,以确保问题不是来自其他部分。好吧,你可以像那样使用
,但在那个确切的例子中,这样做是毫无用处的。考虑三个测试用例。01、02和03。第一次拒绝是因为它不是02,第二次拒绝是因为它不是01,第三次拒绝是因为它既不是01也不是02。您需要
而不是或。还有其他几种方法。你还必须准确地指出什么“不起作用”。编译?跑发生了什么,发生了什么。本能地,我会说是的,但在这种情况下,最好的办法是尝试一下。制作一个模拟的小程序,将COD-USER的值强制到不同的级别,用显示器运行它,然后看看会发生什么。@gazz0x2z好吧,我照你说的做了,它工作得很好。关键是主程序一直在OR子句的下一行给我一个错误,现在我正在检查WHEN语句中的所有代码,以确保问题不是来自其他部分。好吧,你可以像那样使用
,但在那个确切的例子中,这样做是毫无用处的。考虑三个测试用例。01、02和03。第一次拒绝是因为它不是02,第二次拒绝是因为它不是01,第三次拒绝是因为它既不是01也不是02。您需要
而不是或。还有其他几种方法。你还必须准确地指出什么“不起作用”。编译?跑发生了什么,发生了什么。是的,这是一种方式。然而,仅使用一个操作的多个When,虽然完全有效且正确,1)对许多程序员来说是“不寻常的”,2)看起来总是有一行或多行被意外删除。除了真(或假)之外,我并不热衷于评估,但我认为使用真(或假)没有任何实际意义,因为它强制在程序划分中使用文字。导致使用88s作为第二种,也是我首选的方式。@BillWoodger 1)我将其视为一个“可教的时刻”2)在这种情况下,我同意在程序部分使用文字。我遵循的原则是尽量少打扰,也许前后矛盾;这可能是另一个可教的时刻。我不是2的绝对主义者,我看过05一张图片9的值1和05张蓝色图片X(5)的值“蓝色”。是的,简单的数字总是意味着相同的东西(加1到X)应该是文字。每个货盘的最小项目应为描述性项目。蓝色当然毫无意义,但它应该是一个上下文名称。顺便说一句,当编码器说“它不可能循环,看,