文:論理式の評価に応じて,構文または文の 1 つのブロックを条件的に実行します (この構文は FORTRAN 77 ではブロック IF 文と呼ばれていました)。
形式
[name:] IF (expr) THEN
name
(省略可能) IF 構文の名前。
expr
括弧で囲まれたスカラ論理式。
block
ゼロ個以上の文または構文列。
規則と振る舞い
IF THEN 文の先頭で構文名が指定されている場合,対応する END IF 文に同じ名前がなくてはなりません。同じ有効域中の異なる名前の構文に同じ構文名を使用することはできません。
論理式の評価によって,1 つのブロックが実行されるか,どのブロックも実行されないかのどちらかになります。論理式は,真の値が発見されるか,ELSE または END IF 文が現れるまで,順番に評価されていきます。
真の値が発見されるか,ELSE 文が現れると,その直後のブロックが実行され,構文の実行は終了します。
どの論理式も真に評価されず,構文内に ELSE 文が現れない場合,構文内のどのブロックも実行されず,構文の実行は終了します。
IF (e) THEN I = J
この文は,次の論理 IF 文として解釈されます。
IF (e) THENI = J
飛越し文を使って ELSE IF 文または ELSE 文に制御を移すことはできません。ただし,IF 構文の中から END IF 文に飛越しすることはできます。
次図に,IF 構文の中での制御の流れを示します。
IF 構文の中での制御の流れ
IF 構文が 1 つの文ブロックの中に完全に含まれるのであれば,別の IF 構文の文ブロック中に IF 構文を入れ子にすることができます。複数の文ブロックにまたがることはできません。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
例
次の例は,IF 構文の最も単純な形式を示しています。
書式 例 IF (expr) THEN IF (ABS(ADJU) .GE. 1.0E-6) THEN block TOTERR = TOTERR + ABS(ADJU) QUEST = ADJU/FNDVAL END IF END IF
この構文は,IF THEN 文と END IF 文の間の文のブロックを条件的に実行します。
以下に別の例を示します。
! 単純 IF 構文 IF (i .LT. 10) THEN ! 次の 2 つの文は i < 10 の時のみ実行される j = i slice = TAN (angle) END IF
以下の例は,名前付き IF 構文を示しています。
BLOCK_A: IF (D > 0.0) THEN ! 名前付き構文の最初の文。 RADIANS = ACOS(D) ! これら 2 つの文が DEGREES = ACOSD(D) ! ブロックを公正します。 END IF BLOCK_A ! 名前付き構文の最後の文。
次の例は,ELSE 文を含む IF 構文を示しています。
形式 例 IF (expr) THEN IF (NAME .LT. 'N') THEN block1 IFRONT = IFRONT + 1 FRLET(IFRONT) = NAME(1:2) ELSE ELSE block2 IBACK = IBACK + 1 END IF END IF
block1 は,IF THEN 文と ELSE 文の間のすべての文で構成されます。block2 は,ELSE 文と END IF 文の間のすべての文で構成されます。
文字変数 NAME の値が 'N' よりも小さければ,block1 が実行されます。NAME の値が 'N' よりも大きいか等しい場合,block2 が実行されます。
次の例は,ELSE IF THEN 文を含んでいる IF 構文を示しています。
形式 例 IF (expr) THEN IF (A .GT. B) THEN block1 D = B F = A - B ELSE IF (expr) THEN ELSE IF (A .GT. B/2.) THEN block2 D = B/2. F = A - B/2. END IF END IF
A が B よりも大きければ,block1 が実行されます。A が B よりも大きくないが,B/2 よりも大きい場合,block2 が実行されます。A が B よりも大きくなく,B/2 よりも大きくない場合,block1 と block2 のどちらも実行されません。制御は END IF 文の次の実行文に移されます。
以下に別の例を示します。
! ELSE IF 文を持つ IF 構文 IF (j .GT. 1000) THEN ! ここに j > 1000 の時のみ実行する文を書きます。 ELSE IF (j .GT. 100) THEN ! ここに j > 100 かつ j <= 1000 の時のみ実行する文を書きます。 ELSE IF (j .GT. 10) THEN ! ここに j > 10 かつ j <= 100 の時のみ実行する文を書きます。 ELSE ! ここに j <= 10 の時のみ実行する文を書きます。 END IF
次の例は,複数の ELSE IF THEN 文と 1 つの ELSE 文を含んでいる IF 構文を示しています。
形式 例 IF (expr) THEN IF (A .GT. B) THEN block1 D = B F = A - B ELSE IF (expr) THEN ELSE IF (A .GT. C) THEN block2 D = C F = A - C ELSE IF (expr) THEN ELSE IF (A .GT. Z) THEN block3 D = Z F = A - Z ELSE ELSE block4 D = 0.0 F = A END IF END IF
A が B よりも大きければ,block1 が実行されます。A が B よりも大きくないが,C よりも大きい場合,block2 が実行されます。A が B と C のどちらよりも大きくないが,Z よりも大きい場合,block3 が実行されます。A が B,C,Z のどれよりも大きくない場合,block4 が実行されます。
次に,入れ子にされた IF 構文の例を示します。
形式 例 IF (expr) THEN IF (A .LT. 100 block1 INRAN = INRAN + 1 IF (expr2) THEN IF (ABS(A-AVG) .LE. 5.) THEN block1a INAVG = INAVG + 1 ELSE ELSE block1b OUTAVG = OUTAVG + 1 END IF END IF ELSE ELSE block2 OUTRAN = OUTRAN + 1 END IF END IF
A が 100 よりも小さい場合,IF の直後の文が実行されます。この文は入れ子にされた IF 構文を含んでいます。A - AVG の絶対値が 5 以下ならば,block1a が実行されます。A - AVG の絶対値が 5 よりも大きい場合,block1b が実行されます。
A が 100 以上ならば,block2 が実行され,(block1 の中の) 入れ子にされた IF 構文は実行されません。
以下に別の例を示します。
! ELSE IF 文が含まれない IF 構文に続く ! 入れ子になった構文と ELSE 文の使用 IF (i .LT. 100) THEN ! ここに i < 100 の時のみ実行する文を書きます。 IF (j .LT. 10) THEN ! ここに i < 100 かつ j < 10 の時のみ実行する文を書きます。 END IF ! ここに i < 100 の時のみ実行する文を書きます。 ELSE ! ここに i >= 100 の時のみ実行する文を書きます。 IF (j .LT. 10) THEN ! ここに i >= 100 かつ j < 10 の時のみ実行する文を書きます。 END IF ! ここに i >= 100 の時のみ実行する文を書きます。 END IF