CASE

CASE 構文の開始を示します。CASE 構文は,SELECT CASE 文中のスカラ式の値に基づいて,構文または文の 1 つのブロックを条件的に実行します。

形式

[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]

block] ...
[CASE DEFAULT [name]
block]
END SELECT [name]

name
CASE 構文の名前。

expr
整数型,論理型,または文字型の (括弧で囲まれた) スカラ式。この式の結果として,場合指標と呼ばれる値が得られます。

case-value
括弧で囲まれた 1 つまたは複数のスカラ整数型,論理型,または文字型初期値式。個々の case-valueexpr と同じ型の 種別パラメタを持っていなくてはなりません。文字型の場合,case-valueexpr が異なる長さであってもかまいませんが,その種別パラメタは同じでなくてはなりません。

整数式と文字式は,以下のいずれかの形式を取る場合値範囲として表現することができます。

	low:high
	low:
	:high

場合値は重なり合うことはできません。

block
ゼロ個以上の文または構文列。

規則と振る舞い

SELECT CASE 文で構文名を指定している場合,対応する END SELECT 文に同じ名前を指定する必要があります。省略可能なものとして,構文中の任意の CASE 文でも同じ構文名を指定することができます。同じ有効域中の異なる名前の構文に対して,同じ構文名を使用することはできません。

最初に場合式 (expr) が評価されます。その結果として得られた場合指標が,場合値と比較され,一致する値が発見されます (この値は 1 つしか存在できません)。一致するものがあった場合,一致する場合値の後に続くブロックが実行され,構文は終了します。

一致が起こるかどうかは以下の規則によって決定されます。

以下に示すものは,いずれも有効な場合値です。

	CASE (1, 4, 7, 11:14, 22)	! 個々の値を次のように指定:
					! 1, 4, 7, 11, 12, 13, 14, 22
	CASE (:-1)			! すべての値がゼロより小さい
	CASE (0)			! ゼロのみ
	CASE (1:)			! すべての値がゼロより大きい

一致するものがないが,CASE DEFAULT 文が存在する場合,その文の後に続くブロックが実行され,構文は終了します。

一致するものがなく,CASE DEFAULT 文が存在しない場合,どのブロックも実行されず,構文は終了し,制御は END SELECT 文の次の実行文または実行構文に渡されます。

次図に CASE 構文における制御の流れを示します。

CASE 構文における制御の流れ

飛越し文を使って,制御を CASE 文に移すことはできません。ただし,SELECT CASE 文への飛越しは許されています。END SELECT 文への飛越しは,CASE 構文の中からのみ許されています。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

実行制御

次に CASE 構文の例を示します。

	INTEGER FUNCTION STATUS_CODE (I)
	  INTEGER I
	  CHECK_STATUS: SELECT CASE (I)
	  CASE (:-1)
	    STATUS_CODE = -1
	  CASE (0)
	    STATUS_CODE = 0
	  CASE (1:)
	    STATUS_CODE = 1
	  END SELECT CHECK_STATUS
	END FUNCTION STATUS_CODE

	SELECT CASE (J)
	CASE (1, 3:7, 9)		! 値: 1, 3, 4, 5, 6, 7, 9
	  CALL SUB_A
	CASE DEFAULT
	  CALL SUB_B
	END SELECT

以下の 3 つの例は等価です。

	1. SELECT CASE (ITEST .EQ. 1)
	   CASE (.TRUE.)
	     CALL SUB1 ()
	   CASE (.FALSE.)
	     CALL SUB2 ()
	   END SELECT

	2. SELECT CASE (ITEST)
	   CASE DEFAULT 
	     CALL SUB2 ()
	   CASE (1)
	     CALL SUB1 ()
	   END SELECT

	3. IF (ITEST .EQ. 1) THEN
	     CALL SUB1 ()
	   ELSE
	     CALL SUB2 ()
	   END IF

以下に別の例を示します。

	CHARACTER*1 cmdchar
	GET_ANSWER: SELECT CASE (cmdchar)
	CASE ('0')
	   WRITE (*, *) "Must retrieve one to nine files"
	CASE ('1':'9')
	   CALL RetrieveNumFiles (cmdchar)
	CASE ('A', 'a')
	   CALL AddEntry
	CASE ('D', 'd')
	   CALL DeleteEntry
	CASE ('H', 'h')
	   CALL Help
	CASE DEFAULT
	   WRITE (*, *) "Command not recognized; please use H for help"
	END SELECT GET_ANSWER