CL 程式或程序中的 IF 指令
If (IF) 指令用來陳述條件,如果為 true ,則在程式或程序中指定要執行的陳述式或陳述式群組。
Else (ELSE) 指令可以與 IF 指令搭配使用,以指定在 IF 指令所表示的條件為 false 時要執行的陳述式或陳述式群組。
指令包括已測試的表示式 (true 或 false) ,以及指定表示式為 true 時要採取的動作的 THEN 參數。 IF 指令的格式如下:
IF COND(logical-expression) THEN(CL-command)
COND 參數上的邏輯表示式可以是單一邏輯變數或常數,或者它必須說明兩個以上運算元之間的關係; 然後會將表示式評估為 true 或 false。
如果邏輯表示式所說明的條件評估為 true ,則程式或程序會在 THEN 參數上處理 CL 指令。 這可以是單一指令或指令群組。 如果條件不是 true ,程式或程序會執行下一個循序指令。
COND 和 THEN 都是指令上的關鍵字,位置登錄可以省略它們。 下列是此指令的語法正確用法:
IF COND(&RESP=1) THEN(CALL CUS210)
IF (&A *EQ &B) THEN(GOTO LABEL)
IF (&A=&B) GOTO LABEL
Blanks are required between the command name (IF) and the keyword (COND) or value (&A). 如果指定的話,關鍵字與含括該值的左括弧之間不允許空白。
下列範例是關於使用 IF 指令進行條件式處理。 根據 IF 指令中邏輯表示式的評估,以不同方式處理分支。 Assume, for instance, that at the start of the following code, the value of &A is 2 and the value of &C is 4.
IF (&A=2) THEN(GOTO FINAL)
IF (&A=3) THEN(CHGVAR &C 5)
.
.
.
FINAL: IF (&C=5) CALL PROGA
ENDPGM
在此情況下,程式或程序會在分支至 FINAL 之前先處理第一個 IF 指令,並跳過中間程式碼。 它不會回到第二個 IF 指令。 在 FINAL ,因為 &C=5 的測試失敗,所以不會呼叫 PROGA。 然後,程式或程序會處理下一個指令 ENDPGM ,該指令會發出程式或程序結束的信號,並將控制權傳回給呼叫程式或程序。
如果使用相同的程式碼,變數的起始值會不同,則處理邏輯會不同。 For instance, if at the beginning of this code the value of &A is 3 and the value of &C is 4, the first IF statement is evaluated as false. 程式或程序不處理 GOTO FINAL 指令,而是忽略第一個 IF 陳述式並移至下一個 IF 陳述式。 The second IF statement is evaluated as true, and the value of &C is changed to 5. 後續陳述式 (未顯示在這裡) 也會連續處理。 當處理程序達到最後一個 IF 陳述式時,條件 &C=5 會評估為 true ,並呼叫 PROGA。
一系列連續 IF 陳述式會獨立執行。 例如:
PGM /* IFFY */
DCL &A..
DCL &B..
DCL &C..
DCL &D..
DCL &AREA *CHAR LEN(5) VALUE(YESNO)
DCL &RESP..
IF (&A=&B) THEN(GOTO END) /* IF #1 */
IF (&C=&D) THEN(CALL PGMA) /* IF #2 */
IF (&RESP=1) THEN(CHGVAR &C 2) /* IF #3 */
IF (%SUBSTRING(&AREA 1 3) *EQ YES) THEN(CALL PGMB) /* IF #4 */
CHGVAR &B &C
.
.
.
END: ENDPGM
If, in this example, &A is not equal to &B, the next statement is run. If &C is equal to &D, PGMA is called. 當 PGMA 傳回時,會考量第三個 IF 陳述式,依此類推。 內嵌指令是完全含括在另一個指令的參數中的指令。
在下列範例中,內嵌了 Change Variable (CHGVAR) 指令和 DO 指令:
IF (&A *EQ &B) THEN(CHGVAR &A (&A+1))
IF (&B *EQ &C) THEN(DO)
.
.
.
ENDDO