CASE 構文は、実行対象となる多くのステートメント・ブロック の中から 1 つを選択するための簡潔な構文を持っています。 各 CASE ステートメントのケース・セレクター は、SELECT CASE ステートメントのケース式と似ています。
>>-SELECT_CASE_statement--------------------------------------->< >>-+--------------------------+-------------------------------->< | .----------------------. | | V | | '---CASE_statement_block-+-' >>-END_SELECT_statement---------------------------------------->< |
>>-CASE_statement---------------------------------------------->< >>-statement_block--------------------------------------------->< |
構文内では、各ケース値の型は、ケース式の型と同じでなければなりません。
CASE 構文は、次のように実行されます。
CASE 構文には、それぞれに値の範囲を 1 つ指定できるゼロ個以上の CASE ステートメントが入ります。 ただし、CASE ステートメントで指定する値の範囲をオーバーラップさせることはできません。
複数の CASE ステートメントのうちの 1 つで、デフォルトの case_selector を指定することができます。 デフォルトの CASE_statement_block は、CASE 構文の始め、構文の終わり、あるいは他のブロックの間など、 構文内ならどこにあってもかまいません。
構文名を指定する場合、SELECT CASE ステートメントおよび END SELECT ステートメントには 必ず指定が必要ですが、CASE ステートメントへの指定はオプションとなります。
CASE 構文内からは、END SELECT ステートメントに対してのみ分岐できます。 CASE ステートメントは分岐ターゲットにはなれません。
マイグレーションのためのヒント: IF ブロックの代わりに CASE を FORTRAN 77 ソース IF (I .EQ.3) THEN CALL SUBA() ELSE IF (I.EQ. 5) THEN CALL SUBB() ELSE IF (I .EQ. 6) THEN CALL SUBC() ELSE CALL OTHERSUB() ENDIF END Fortran 90 または Fortran 95 ソース SELECTCASE(I) CASE(3) CALL SUBA() CASE(5) CALL SUBB() CASE(6) CALL SUBC() CASE DEFAULT CALL OTHERSUB() END SELECT END |
ZERO: SELECT CASE(N) CASE DEFAULT ZERO OTHER: SELECT CASE(N) ! start of CASE construct OTHER CASE(:-1) SIGNUM = -1 ! this statement executed when n<=-1 CASE(1:) OTHER SIGNUM = 1 END SELECT OTHER ! end of CASE construct OTHER CASE (0) SIGNUM = 0 END SELECT ZERO END