*AND , *OR 和 *NOT 运算符
逻辑运算符 *AND 和 *OR 指定逻辑表达式中操作数之间的关系。 逻辑运算符 *NOT 用于对逻辑变量或常量求反。
*AND 和 *OR 是用于指定逻辑表达式中操作数之间的关系的保留值。 双关符号 (&) 可以替换保留值 *AND,竖杠 (|) 可以替换 *OR。 保留值必须在前面和后面都是空格。 逻辑表达式中的操作数由关系表达式,逻辑变量或由逻辑运算符分隔的常量组成。 *AND 运算符指示两个操作数 (在运算符的任何一侧) 都必须为 true 才能生成真正的结果。 *OR 运算符指示其一个或另一个操作数必须为 true 才能生成 true 结果。
在表达式中使用除逻辑运算符以外的运算符来指示要对表达式中的操作数或操作数之间的关系执行的操作。 除了逻辑运算符以外,还有三种运算符:
- 算术 (+ ,-, * ,/)
- 字符 (*CAT, ||, *BCAT, |>, *TCAT, |<)
- 关系式 (*EQ, =, * GT, >, *LT, <, *GE, >=, *LE, <=, *NE, ¬=, *NG, ¬>, *NL, ¬<)
以下示例是关于逻辑表达式的示例:
((&C *LT 1) *AND (&TIME *GT 1430))
(&C *LT 1 *AND &TIME *GT 1430)
((&C < 1) & (&TIME>1430))
((&C< 1) & (&TIME>1430))
在上述每种情况下,逻辑表达式由三个部分组成: 两个操作数和一个运算符 (*AND 或 *OR 或它们的符号)。 它是将表达式描述为逻辑的运算符 (*AND 或 *OR) 的类型,而不是操作数的类型。 逻辑表达式中的操作数可以是逻辑变量或其他表达式,例如关系表达式。 (关系表达式的特征是使用 >、< 或 = 符号或相应的保留值) 例如,在以下示例中,整个逻辑表达式括在括号中,两个操作数都是关系表达式,也分别括在括号中:
((&C *LT 1) *AND (&TIME *GT 1430))
从逻辑表达式的第二个示例中可以看到,无需将操作数括在单独的括号中,但建议您明确说明。 不需要括号,因为 *AND 和 *OR 具有不同的优先级。 *AND 始终被视为在 *OR 之前。 对于具有相同优先级的运算符,可以使用括号来控制操作的执行顺序。
可以将简单关系表达式编写为命令中的条件:
IF (&A=&B) THEN(DO)
.
.
.
ENDDO
此关系表达式中的操作数也可以是常量。
如果要指定多个条件,可以使用带有关系表达式的逻辑表达式作为操作数:
IF ((&A=&B) *AND (&C=&D)) THEN(DO)
.
.
.
ENDDO
可以对 CL 程序或过程中的嵌入式 IF 命令 中作为示例引用的一系列从属 IF 命令进行编码:
PGM
DCL &RESP *DEC 1
DCL &A *DEC 1
DCL &B *CHAR 2
IF ((&RESP=1) *AND (&A=5) *AND (&B=NO)) THEN(DO)
.
.
.
ENDDO
CHGVAR &A VALUE(8)
CALLPRC PROC(DAILY)
ENDPGM
在此,将在关系表达式之间再次使用逻辑运算符。
因为一个逻辑表达式也可以有其他逻辑表达式作为操作数,所以相当复杂的逻辑是可能的:
IF (((&A=&B) *OR (&A=&C)) *AND ((&C=1) *OR (&D='0'))) THEN(DO)
在这种情况下,&D 被定义为逻辑变量。
任何关系或逻辑表达式的求值结果都是 "1" 或 "0" (true 或 false)。 仅当完整表达式求值为 true ("1") 时,才会处理从属命令。 以下命令在这些术语中进行解释:
IF ((&A = &B) *AND (&C = &D)) THEN(DO)
((true'1') *AND (not true'0'))
(not true '0')
表达式最终求值为不为 true ("0") ,因此不会处理 DO。 有关如何达到此评估的说明,请参阅本节后面的矩阵。
此过程用于使用逻辑变量对逻辑表达式进行求值,如以下示例中所示:
PGM
DCL &A *LGL
DCL &B *LGL
IF (&A *OR &B) THEN(CALL PGM(PGMA))
.
.
.
ENDPGM
在这里,对条件表达式进行评估,以确定 &A 或 &B 的值是否等于 "1"(true)。 如果其中一个为 true ,那么整个表达式为 true ,并且将调用 PGMA。
所有这些逻辑表达式示例的最终评估都是基于在 *OR 或 *AND 操作符下比较两个值(这里称为 &A 和 &B)的标准矩阵。
将 *OR 与逻辑变量或常量配合使用时,请使用以下矩阵:
- 如果 &A 是:
- '0' '0' '1' '1'
- 和 &B 是:
- '0' '1' '0' '1'
- OR 表达式为:
- '0' '1' '1' '1'
简而言之,对于具有逻辑变量或常量的多个 OR 运算符,如果所有值都为 false ,那么表达式为 false ("0")。 如果任何值为 true ,那么表达式为 true ("1")。
PGM
DCL &A *LGL VALUE('0')
DCL &B *LGL VALUE('1')
DCL &C *LGL VALUE('1')
IF (&A *OR &B *OR &C) THEN(CALL PGMA)
.
.
.
ENDPGM
此处的值并非全部为 false; 因此,表达式为 true ,将调用 PGMA。
使用带有逻辑变量或常量的 *AND 对逻辑表达式求值时,请使用以下矩阵:
- 如果 &A 是:
- '0' '0' '1' '1'
- 和 &B 是:
- '0' '1' '0' '1'
- ANDed 表达式为:
- '0' '0' '0' '1'
对于具有逻辑变量或常量的多个 AND 运算符,当任何值为 false 时,表达式为 false ("0") ,当它们都为 true 时,表达式为 true。
PGM
DCL &A *LGL VALUE('0')
DCL &B *LGL VALUE('1')
DCL &C *LGL VALUE('1')
IF (&A *AND &B *AND &C) THEN(CALL PGMA)
.
.
.
ENDPGM
此处的值并非全部为 true; 因此,表达式为 false ,并且不调用 PGMA。
仅当操作数表示逻辑值时,才能在表达式中使用这些逻辑运算符,如前面的示例中所示。 尝试对不符合逻辑的变量使用 OR 或 AND 是不正确的。 例如:
PGM
DCL &A *CHAR 3
DCL &B *CHAR 3
DCL &C *CHAR 3
Incorrect: IF (&A *OR &B *OR &C = YES) THEN...
这方面的正确编码将是:
IF ((&A=YES) *OR (&B=YES) *OR (&C=YES)) THEN...
在这种情况下,在关系表达式之间发生 ORing。
逻辑运算符 *NOT (或 ¬) 用于对逻辑变量或常量求反。 在对 *AND 或 *OR 运算符进行求值之前,必须对任何 *NOT 运算符进行求值。 在对操作数之间的逻辑关系进行求值之前,必须对 *NOT 运算符后面的任何值进行求值。
PGM
DCL &A *LGL '1'
DCL &B *LGL '0'
IF (&A *AND *NOT &B) THEN(CALL PGMA)
在此示例中,值全部为 true; 因此,表达式为 true ,将调用 PGMA。
PGM
DCL &A *LGL
DCL &B *CHAR 3 VALUE('ABC')
DCL &C *CHAR 3 VALUE('XYZ')
CHGVAR &A VALUE(&B *EQ &C)
IF (&A) THEN(CALLPRC PROCA)
在此示例中,值为 false ,因此不会调用 PROCA。