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