FORTRAN 77 言語リファレンス ホーム目次前ページへ次ページへ索引


第 3 章

この章では、Fortran の式について説明しています。

式と演算子とオペランド

式は 1 つ以上のオペランド、ゼロ以上の演算子、およびゼロ以上の括弧の組み合わせから成ります。

式には次の 3 種類があります。

演算子はどのような処理または演算を行うかを指示します。

オペランドは処理を適用する項目を指示します。オペランドは以下のいずれかのデータ項目です。

算術式

算術式は結果として単一の算術値をもたらします。算術式のオペランドは次の型を持っています。© は規格外の機能を示します。

算術式の演算子は以下のいずれかです。

表 3-1   算術演算子
演算子 意味
** 
* 
/ 
- 
+ 
 べき乗 
 乗算
 除算
 減算または単項マイナス
 加算または単項プラス


BYTE または LOGICAL オペランドを算術演算子と組み合わせると、整数データとして解釈されます。

これらの演算子は次の形式では二項演算子です。

	a @  b 

ab はオペランドであり、@ の位置には **、*、/、-、または + のいずれかの演算子が入ります。

例: 二項演算子

	A-Z 
	X*B 

演算子の + と - は次の形式では単項演算子です。

	@ b

ここで b はオペランドであり、@ の位置には -+ 演算子のどちらかが入ります。

例: 単項演算子

	-Z 
	+B 

基本的な算術式

各々の算術演算子の基本的な式を以下に示します。

表 3-2   算術式
意味
a ** z 
a / z 
a * z 
a - z 
-z 
a + z 
+z 
az 乗する
az で割る
az を掛ける
a から z を引く
z の符号を反転する
za に足す
z と同じ


括弧がなく、式に 2 つ以上の演算子がある場合、演算順序は演算子の優先順位によって決まります。1 つの例外を除き、演算子の優先順位が等しければ左から右へ評価されます。

表 3-3   算術演算子の優先順位
演算子 優先順位
** 
* / 
+ - 
 最初 
 2 番目 
 最後


左から右への規則の例外を以下に示します。

F ** S ** Z

上記の式は次のように評価されます。

F ** (S ** Z) 

f77 では 2 つの連続する演算子を使用できます。©

例: 2 つの連続する演算子

	X ** -A * Z 

上記の式は次のように評価されます。

	X ** (-(A * Z)) 

上の例において、コンパイラはまず ** を評価しますが、X を何乗するかを知る必要が生じます。式の残りの部分を見て -* を選択しなければなりません。コンパイラはまず * を、次に - を、最後に ** を選択します。

混合モード

BYTE オペランドを除いて、両方のオペランドが同じ型を持っている場合、結果の値も同じ型を持ちます。(両方のオペランドの型が BYTE である算術演算の結果は、デフォルトの整数になります。) オペランドが異なる型を持っている場合、弱い型が強い型に拡張されます。弱い型とは精度が低い、または記憶単位が小さい方の型です。以下の強度の一覧表にまとめます。

データ型 強度
BYTE または LOGICAL*1 
LOGICAL*2 
LOGICAL*4 
INTEGER*2 
INTEGER*4 
INTEGER*8 
LOGICAL*8 
REAL*4 (実数) 
REAL*8 (倍精度) 
REAL*16 (4 倍精度) (SPARC のみ)
COMPLEX*8 (複素数) 
COMPLEX*16 (倍精度複素数) 
COMPLEX*32 (4 倍精度複素数) (SPARC のみ)
 1 (弱い) 
 2 
 3 
 4 
 5 
 6 
 6 
 6 
 7 
 8 
 9 
 10 
 11 (強い) 



注 - REAL*4INTEGER*8、LOGICAL*8 は同じ強度ですが、異なるオペランドの組み合わせ結果です。たとえば、INTEGER*8 と強度 1〜5 の型とを組み合わせると、結果は INTEGER*8 になります。1 つのオペランドが REAL*4 で、もう 1 つが強度 1〜5 の型の場合、結果は INTEGER*4 です。LOGICAL*8 は、結果のサイズが 8 バイトであるということを意味するにすぎません。

混合モードの例: R が実数で、I が整数であれば、次の式は実数型を持ちます。

	R * I 

まず I が実数に拡張され、乗算が行われるからです。

規則

式のデータ型に関する規則は次のとおりです。

例: 次の式は結果としてゼロになります。

	2/3 + 3/4 

これに対する拡張が 1 つあります。算術演算の中の論理型またはバイト型オペランドは整数として使用されるということです。

次の例は integer 型と logical 型の組み合せを示しています。

	COMPLEX  C1 / ( 1.0, 2.0 ) /
	INTEGER*2 I1, I2, I3 
	LOGICAL L1, L2, L3, L4, L5 
	REAL R1 / 1.0 /
	DATA I1 / 8 /, I2 / 'W' /, I3 / 0 / 
	DATA L1/.TRUE./, L2/.TRUE./, L3/.TRUE./, L4/.TRUE./,
&	L5/.TRUE./ 
	L1 = L1 + 1 
	I2 = .NOT. I2 
	L2 = I1 .AND. I3 
	L3 = I1 .OR. I2
	L4 = L4 + C1
	L5 = L5 + R1

結果の型

整数オペランドに論理演算を適用すると、演算はビットごとに行われます。結果は整数です。

オペランドが整数と論理オペランドの組み合せであれば、論理オペランドは整数に変換され、結果は整数になります。

算術代入

算術代入文は変数、配列要素、記録、または記録欄に値を代入します。構文は次のとおりです。

v = e
e 算術式、文字定数、または論理式
v 数値変数、配列要素、または記録欄


論理値を数値として代入することは許可されますが、規格外なので移植できない場合があります。結果のデータ型は v のデータ型になります。©

算術代入文を実行すると、式 e が評価され、(型が異なる場合) v の型に変換され、v に代入されます。結果の値の型は次表に従って決まります。

文字定数は整数型または実数型の変数に代入できます。文字定数とはホレリス定数、またはアポストロフィか引用符で囲まれた文字列です。文字はデータの変換を伴わずに変数に移されます。これは規格外なので移植できない場合があります。©

v の型 e の型
INTEGER*2、INTEGER*4、INTEGER*8 INT (e)
REAL REAL (e)
REAL*8 DBLE (e)
REAL*16 (SPARC のみ) QREAL (e) (SPARC のみ)
DOUBLE PRECISION DBLE (e)
COMPLEX*8 CMPLX (e)
COMPLEX*16 DCMPLX (e)
COMPLEX*32 (SPARC のみ) QCMPLX (e) (SPARC のみ)



注 - オプション -i2-dbl-r8、または -xtypemap のいずれかを指定してコンパイルした場合、e の想定される型に影響があります。これについては第 2 章「データ型とデータ項目」を参照してください。これらのオプションについては、『Fortran ユーザーズガイド』も参照してください。

例: 算術代入

	INTEGER I2*2, J2*2, I4*4 
	LOGICAL L1, L2
	REAL R4*4, R16*16 
	DOUBLE PRECISION DP 
	COMPLEX C8, C16*16 
	J2 = 29002 
	I2 = J2 
	I4 = (I2 * 2) + 1 
	DP = 6.4D0 
	QP = 9.8Q1 
	R4 = DP 
	R16 = QP 
	C8 = R1 
	C8 = ( 3.0, 5.0 ) 
	I2 = C8 
	C16 = C8 
	C8 = L1
	R4 = L2

文字式

文字式とはオペランドが文字型を持つ式のことです。文字式は結果として、 1 つ以上の文字を持つ文字型の 1 つの値をもたらします。唯一の文字演算子は連結演算子 // です。

意味
a // z az を連結する


2 つの文字列を連結した結果は、左オペランドの文字のすぐ後に右オペランドの文字が続く 3 番目の文字列になります。連結演算 a//z の値は文字列であり、この文字列の値は z の値を右側に連結した a の値です。この文字列の長さは az の長さの合計です。

オペランドは以下のいずれかのデータ項目です。

例: 文字式 (C、S、および R.C は文字と仮定します)

	'wxy' 
	'AB' // 'wxy' 
	C 
	C // S 
	C(4:7) 
	R.C 

以下に、(規格外の) 例外を示します。©

例: Control-C を入力する有効な方法

	CHARACTER etx
	etx = CHAR(3)

文字列の代入

文字列の代入形式は次のとおりです。

v = e
e 代入値を与える式
v 変数、配列要素、部分列、文字記録欄


文字代入の意味は、文字を右側から左側へコピーすることです。文字代入文を実行すると、文字式が評価され、結果の値が v に代入されます。

例: 次のプログラムは "joinedDD" を表示します。

	CHARACTER A*4, B*2, C*8 
	A = 'join' 
	B = 'ed' 
	C = A // B 
	PRINT *, C 
	END 

また、次のプログラムは equal 文字列を表示します。

	IF ( ('ab' // 'cd') .EQ. 'abcd' ) PRINT *, 'equal' 
	END

例: 文字代入

	CHARACTER BELL*1, C2*2, C3*3, C5*5, C6*6 
	REAL Z
	C2 = 'z' 
	C3 = 'uvwxyz' 
	C5 = 'vwxyz' 
	C5(1:2) = 'AB' 
	C6 = C5 // C2 
	I = 'abcd' 
	Z = 'wxyz'
	BELL = CHAR(7)   制御文字 (^G)

上記の結果は次のとおりです。

C2
'zD' 
後続の空白
 C3
'uvw' 

 C5
'ABxyz'

 C6
'ABxyzz' 
すなわち、C2 からの 'z' 
 I
'abcd' 

 Z
'wxyz' 

BELL
 07 hex 
Control-G、ベル


例 : ホレリス代入 ©

	CHARACTER S*4 
	INTEGER I2*2, I4*4 
	REAL R 
	S = 4Hwxyz 
	I2 = 2Hyz 
	I4 = 4Hwxyz 
	R = 4Hwxyz 

代入の規則

文字代入の規則は次のとおりです。

論理式

論理式は 1 つ以上の論理オペランドと論理演算子の組み合わせから成ります。論理式は結果として単一の論理値をもたらします。演算子は以下のいずれかです。

表 3-4   論理演算子
演算子 標準名
.AND. 
.OR. 
.NEQV. 
.XOR. 
.EQV.
.NOT.
論理積
論理和 (内包的論理和)
論理非等価
排他的論理和
論理等価
論理否定


区切り文字のピリオドが必要です。

2 番めの論理演算子が .NOT. 演算子でないかぎり、2 つの論理演算子を連続して使用することはできません。

論理演算子は以下に示す優先順位に従って評価されます。

表 3-5   論理演算子の優先順位
演算子 優先順位
.NOT.
.AND. 
.OR.
.NEQV.、.XOR.、.EQV. 
高位
--
--
低位


論理演算子の優先順位が等しければ、左から右へ評価されます。

論理式の中で論理演算子を他の演算子と混在して使用する場合、優先順位は次のようになります。

表 3-6   演算子の優先順位
演算子 優先順位
算術演算子 
文字演算子
関係演算子
論理演算子
高位
--
--
低位


基本となる論理式の意味は次のとおりです。

表 3-7   論理式とその意味
論理式 意味
X .AND. Y 
X .OR. Y 
X .NEQV. Y 
X .XOR. Y 
X .EQV. Y 
.NOT. X
X、Y ともに真
X、Y の少なくとも一方が真
X、Y ともに真ではなく、ともに偽でもない
X、Y の一方だけが真
X、Y ともに真またはともに偽
論理否定


サイズが違うオペランドに対する論理演算では、結果の論理値は最大オペランドのサイズになります。たとえば L2.AND.L4 の場合、L2LOGICAL*2 で、L4LOGICAL*4 であると、結果は LOGICAL*4 になります。

BYTE © の変数は、LOGICAL*1 として処理されます。

論理代入

論理式の値を論理変数に代入する構文は次のとおりです。

v = e
e 論理式、-128 と 127 の間の整数、または単一の文字定数 ©
v 論理変数、配列要素、または記録欄


論理代入文を実行すると論理式 e が評価され、結果の値が v に代入されます。e が (-128 と 127 の間の整数または単一の文字定数ではなく) 論理式の場合、e は真か偽のどちらかの値を持っていなければなりません。

任意のサイズの論理式を任意のサイズの論理変数に代入できます。

数値を論理値として代入することはできます (ゼロ以外のすべての値が .TRUE. として処理され、ゼロは .FALSE. として処理される) が、規格外なので移植できない場合があります。©

例: 論理代入

	LOGICAL B1*1, B2*1 
	LOGICAL L3, L4 
	B2 = B1 
	B1 = L3 
	L4 = .TRUE. 

関係演算子

関係演算子は 2 つの算術式または 2 つの文字式を比較し、結果として単一の論理値をもたらします。演算子は以下のいずれかです。

演算子 意味
.LT.
.LE.
.EQ.
.NE.
.GT.
.GE.
小さい
小さいか等しい
等しい
等しくない
大きい
大きいか等しい


区切り文字のピリオドが必要です。

すべての関係演算子の優先順位は同じです。文字演算子と算術演算子は関係演算子に優先します。

関係式の場合、2 つのオペランドの各々が評価され、次にその 2 つの値が比較されます。指定した関係が成り立つ場合の値は真であり、そうでない場合は偽です。

例:関係演算子

	NODE .GE. 0 
	X .LT. Y 
	U*V .GT. U-V 
	M+N .GT. U-V 			混合モード: 整数  M+N  は実数になる
	STR1 .LT. STR2 			STR1 と STR2 は文字型
	S .EQ. 'a' 			S は文字型

文字関係式の場合、

定数式

定数式は明示的な定数とパラメータ (定数名)、そして Fortran 演算子から構成されています。各々のオペランドは、それ自体が別の定数式、定数、定数の英字名、または定数引数によって呼び出される組み込み関数になっています。

例: 定数式

	PARAMETER (L=29002), (P=3.14159), (C='along the ') 
	PARAMETER ( I=L*2, V=4.0*P/3.0, S=C//' riverrun' ) 
	PARAMETER ( M=MIN(I,L), IA=ICHAR('A') ) 
	PARAMETER ( Q=6.4Q6, D=2.3D9 ) 
	K = 66 * 80 
	VOLUME = V*10**3 
	DO I = 1, 20*3 

定数式の制限事項は次のとおりです。

例: 浮動小数点のべき乗は許可されません。

demo% cat ConstExpr.f 
	parameter (T=2.0*(3.0**2.5)) 
	write(*,*) t 
	end 
demo% f77 ConstExpr.f 
ConstExpr.f: 
 MAIN: 
"ConstExpr.f", line 1: 警告: 
	パラメータ t が定数以外に設定されています
demo% a.out 
    31.1769 
demo% 

記録代入

記録代入の一般的な形式は次のとおりです。©

v = e
e 記録または記録欄
v 記録または記録欄


ev は同じ構造体を持つ必要があります。つまり、各々が同じ数の欄を持ち、対応する欄は同じ型とサイズでなければなりません。

例: 記録代入と記録欄代入

	STRUCTURE /PRODUCT/ 
	INTEGER*4 ID 
	CHARACTER*16 NAME 
	CHARACTER*8 MODEL 
	REAL*4 COST 
	REAL*4 PRICE 
	END STRUCTURE 
	RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10) 
	... 
	CURRENT = NEXT 
	LINE(1) = CURRENT 
	WRITE ( 9 ) CURRENT 
	NEXT.ID = 82 

上記の例では、最初の代入文は 1 つの記録全体 (5 つの欄全部) を別の記録に、2 番目の代入文は記録全体を記録の配列の最初の要素にコピーします。WRITE 文は記録全体を出力し、最後の文は記録の ID 欄を 82 に設定します。

式の評価

次の制限事項はすべての算術式、文字式、関係式、および論理式に適用されます。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引