IF 構文

:論理式の評価に応じて,構文または文の 1 つのブロックを条件的に実行します (この構文は FORTRAN 77 ではブロック IF 文と呼ばれていました)。

形式

[name:] IF (expr) THEN

block
[ELSE IF (expr) THEN [name]
block] ...
[ELSE [name]
block]
END IF [name]

name
(省略可能) IF 構文の名前。

expr
括弧で囲まれたスカラ論理式。

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

規則と振る舞い

IF THEN 文の先頭で構文名が指定されている場合,対応する END IF 文に同じ名前がなくてはなりません。同じ有効域中の異なる名前の構文に同じ構文名を使用することはできません。

論理式の評価によって,1 つのブロックが実行されるか,どのブロックも実行されないかのどちらかになります。論理式は,真の値が発見されるか,ELSE または END IF 文が現れるまで,順番に評価されていきます。

真の値が発見されるか,ELSE 文が現れると,その直後のブロックが実行され,構文の実行は終了します。

どの論理式も真に評価されず,構文内に ELSE 文が現れない場合,構文内のどのブロックも実行されず,構文の実行は終了します。


注意:ブロック IF 構文の IF THEN 文の後に文を追加することはできません。たとえば,次の文はブロック IF 構文では無効です。

	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 - 論理実行制御

次の例は,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

AB よりも大きければ,block1 が実行されます。AB よりも大きくないが,B/2 よりも大きい場合,block2 が実行されます。AB よりも大きくなく,B/2 よりも大きくない場合,block1block2 のどちらも実行されません。制御は 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

AB よりも大きければ,block1 が実行されます。AB よりも大きくないが,C よりも大きい場合,block2 が実行されます。ABC のどちらよりも大きくないが,Z よりも大きい場合,block3 が実行されます。ABCZ のどれよりも大きくない場合,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

A100 よりも小さい場合,IF の直後の文が実行されます。この文は入れ子にされた IF 構文を含んでいます。A - AVG の絶対値が 5 以下ならば,block1a が実行されます。A - AVG の絶対値が 5 よりも大きい場合,block1b が実行されます。

A100 以上ならば,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