*AND、*OR 及 *NOT 運算子
邏輯運算子 *AND 和 *OR 指定邏輯表示式中運算元之間的關係。 邏輯運算子 *NOT 是用來使邏輯變數或常數無效。
*AND 和 *OR 是保留值,用來指定邏輯表示式中運算元之間的關係。 The ampersand symbol (&) can replace the reserved value *AND, and the vertical bar (|) can replace *OR. 保留值必須前後接空白。 邏輯表示式中的運算元由關聯式表示式或邏輯變數或以邏輯運算子區隔的常數組成。 *AND 運算子指出兩個運算元 (在運算子的任一端) 必須為 true 才能產生 true 結果。 *OR 運算子指出其中一個或另一個運算元必須為 true 才能產生 true 結果。
在表示式中使用邏輯運算子以外的運算子,以指出要對表示式中的運算元執行的動作,或運算元之間的關係。 除了邏輯運算子之外,還有三種運算子:
- 算術 (+ ,-, * ,/)
- Character (*CAT, ||, *BCAT, |>, *TCAT, |<)
- Relational (*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) 類型。 邏輯表示式中的運算元可以是邏輯變數或其他表示式,例如關聯式表示式。 (Relational expressions are characterized by >, <, or = symbols or corresponding reserved values.) 例如,在下列範例中,整個邏輯表示式以括弧括住,且兩個運算元都是關聯式表示式,也分別以括弧括住:
((&C *LT 1) *AND (&TIME *GT 1430))
如您從邏輯表示式的第二個範例所見,運算元不需要以個別括弧括住,但建議明確說明。 不需要括弧,因為 *AND 和 *OR 具有不同的優先順序。 在 *OR 之前一律考量 *AND。 對於具有相同優先順序的運算子,可以使用括弧來控制執行作業的順序。
簡式關聯式表示式可以撰寫為指令中的條件:
IF (&A=&B) THEN(DO)
.
.
.
ENDDO
此關聯式表示式中的運算元也可以是常數。
如果您要指定多個條件,則可以使用邏輯表示式與關聯式表示式作為運算元:
IF ((&A=&B) *AND (&C=&D)) THEN(DO)
.
.
.
ENDDO
在 CL 程式或程序中的 Embedded 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)
In this case, &D is defined as a logical variable.
任何關聯式或邏輯表示式的評估結果為 '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
Here the conditional expression is evaluated to see if the value of &A or of &B is equal to '1' (true). 如果任一個為 true ,則整個表示式為 true ,並呼叫 PGMA。
The final evaluation arrived at for all these examples of logical expressions is based on standard matrices comparing two values (referred to here as &A and &B) under an *OR or *AND operator.
當搭配使用 *OR 與邏輯變數或常數時,請使用下列矩陣:
- If &A is:
- '0' '0' '1' '1'
- and &B is:
- '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 搭配邏輯變數或常數來評估邏輯表示式時,請使用下列矩陣:
- If &A is:
- '0' '0' '1' '1'
- and &B is:
- '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...
在此情況下,在關聯式表示式之間發生 OR 運算。
邏輯運算子 *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。