FORTRAN 77 言語リファレンス |
第 3 章
式
式と演算子とオペランド
式は 1 つ以上のオペランド、ゼロ以上の演算子、およびゼロ以上の括弧の組み合わせから成ります。
オペランドは処理を適用する項目を指示します。オペランドは以下のいずれかのデータ項目です。
算術式
算術式は結果として単一の算術値をもたらします。算術式のオペランドは次の型を持っています。© は規格外の機能を示します。
BYTE
©COMPLEX
COMPLEX*32
(SPARC のみ) ©DOUBLE COMPLEX
©DOUBLE PRECISION
INTEGER
LOGICAL
REAL
REAL*16
(SPARC のみ) ©
表 3-1 算術演算子 ***/-+ べき乗乗算除算減算または単項マイナス加算または単項プラス
BYTE
またはLOGICAL
オペランドを算術演算子と組み合わせると、整数データとして解釈されます。
a @ ba と b はオペランドであり、@ の位置には
**、*、/、-、
または+
のいずれかの演算子が入ります。
A-ZX*B
@ bここで b はオペランドであり、@ の位置には
-
か+
演算子のどちらかが入ります。
-Z+B基本的な算術式
表 3-2 算術式 a ** za / za * za - z-za + z+za
をz
乗するa
をz
で割るa
にz
を掛けるa
からz
を引くz
の符号を反転するz
をa
に足すz
と同じ
括弧がなく、式に 2 つ以上の演算子がある場合、演算順序は演算子の優先順位によって決まります。1 つの例外を除き、演算子の優先順位が等しければ左から右へ評価されます。
表 3-3 算術演算子の優先順位 *** /+ - 最初2 番目最後
F ** S ** Z
F ** (S ** Z)
X ** -A * Z
X ** (-(A * Z))上の例において、コンパイラはまず
**
を評価しますが、X
を何乗するかを知る必要が生じます。式の残りの部分を見て-
か*
を選択しなければなりません。コンパイラはまず*
を、次に-
を、最後に**
を選択します。混合モード
BYTE オペランドを除いて、両方のオペランドが同じ型を持っている場合、結果の値も同じ型を持ちます。(両方のオペランドの型が BYTE である算術演算の結果は、デフォルトの整数になります。) オペランドが異なる型を持っている場合、弱い型が強い型に拡張されます。弱い型とは精度が低い、または記憶単位が小さい方の型です。以下の強度の一覧表にまとめます。
注 -REAL*4
、INTEGER*8、LOGICAL*8
は同じ強度ですが、異なるオペランドの組み合わせ結果です。たとえば、INTEGER*8
と強度 1〜5 の型とを組み合わせると、結果はINTEGER*8
になります。1 つのオペランドがREAL*4
で、もう 1 つが強度 1〜5 の型の場合、結果はINTEGER*4
です。LOGICAL*8
は、結果のサイズが 8 バイトであるということを意味するにすぎません。
混合モードの例:
R
が実数で、I
が整数であれば、次の式は実数型を持ちます。
R * I規則
2/3 + 3/4
INTEGER*8
オペランドがREAL*4
オペランドと混合されると、結果はREAL*8
になります。
- これに対する拡張が 1 つあります。算術演算の中の論理型またはバイト型オペランドは整数として使用されるということです。
- 実数の演算子は両オペランドが実数か、またはバイト、論理、または整数と、実数のオペランドの組み合せに適用されます。実数オペランドと組み合わされた整数オペランドは実数に拡張されます。拡張後の実数の小数部はゼロです。たとえば、
R
が実数で、I
が整数であれば、R+I
は実数になります。ただし、(2/3)*4.0
は0
になることに注意してください。- 倍精度の演算子は倍精度オペランドに適用され、これより低い精度のオペランドは倍精度に拡張されます。拡張後の倍精度数値の新しい最下位ビットはゼロに設定されます。実数オペランドを拡張してもオペランドの精度は上がりません。
- 複素数の演算子は複素数オペランドに適用されます。整数オペランドは実数に拡張され、複素数オペランドの実部として使用されます。虚部はゼロに設定されます。
- 論理変数に対して数値演算子が許可されます。© Fortran 規格が数値を要求するあらゆる場所に論理値を使用することができます。ここでの数値とは
integer、real、complex、double precision、double complex、real*16
(SPARC のみ) のいずれかです。コンパイラは論理値を暗黙的に適切な数値に変換します。これらの機能を使用すると、プログラムは移植できない場合があります。次の例は
integer
型とlogical
型の組み合せを示しています。
結果の型
整数オペランドに論理演算を適用すると、演算はビットごとに行われます。結果は整数です。
オペランドが整数と論理オペランドの組み合せであれば、論理オペランドは整数に変換され、結果は整数になります。
算術代入
算術代入文は変数、配列要素、記録、または記録欄に値を代入します。構文は次のとおりです。
v = e e 算術式、文字定数、または論理式 v 数値変数、配列要素、または記録欄
論理値を数値として代入することは許可されますが、規格外なので移植できない場合があります。結果のデータ型は v のデータ型になります。©
算術代入文を実行すると、式 e が評価され、(型が異なる場合) v の型に変換され、v に代入されます。結果の値の型は次表に従って決まります。
文字定数は整数型または実数型の変数に代入できます。文字定数とはホレリス定数、またはアポストロフィか引用符で囲まれた文字列です。文字はデータの変換を伴わずに変数に移されます。これは規格外なので移植できない場合があります。©
注 - オプション-i2
、-dbl
、-r8
、または-xtypemap
のいずれかを指定してコンパイルした場合、e の想定される型に影響があります。これについては第 2 章「データ型とデータ項目」を参照してください。これらのオプションについては、『Fortran ユーザーズガイド』も参照してください。
文字式
文字式とはオペランドが文字型を持つ式のことです。文字式は結果として、 1 つ以上の文字を持つ文字型の 1 つの値をもたらします。唯一の文字演算子は連結演算子 // です。
a // z a と z を連結する
2 つの文字列を連結した結果は、左オペランドの文字のすぐ後に右オペランドの文字が続く 3 番目の文字列になります。連結演算 a//z の値は文字列であり、この文字列の値は z の値を右側に連結した a の値です。この文字列の長さは a と z の長さの合計です。
例: 文字式 (
C、S
、およびR.C
は文字と仮定します)
'wxy''AB' // 'wxy'CC // SC(4:7)R.C
- 制御文字 -- 制御文字を入力するには、Control キーを押しながら別のキーを押します。たいていの制御文字はこの方法で入力できますが、Control-A、 Control-B、Control-C、または Control-J は入りません。
- 複数バイト文字 -- 漢字などの複数バイト文字は、コメントや文字列で使用することができます。
文字列の代入
e 代入値を与える式 v 変数、配列要素、部分列、文字記録欄
文字代入の意味は、文字を右側から左側へコピーすることです。文字代入文を実行すると、文字式が評価され、結果の値が v に代入されます。
例: 次のプログラムは
"joined
DD"
を表示します。
CHARACTER A*4, B*2, C*8A = 'join'B = 'ed'C = A // BPRINT *, CEND
IF ( ('ab' // 'cd') .EQ. 'abcd' ) PRINT *, 'equal'END
CHARACTER BELL*1, C2*2, C3*3, C5*5, C6*6REAL ZC2 = 'z'C3 = 'uvwxyz'C5 = 'vwxyz'C5(1:2) = 'AB'C6 = C5 // C2I = 'abcd'Z = 'wxyz'BELL = CHAR(7) 制御文字 (^G)
C3
'uvw'C5
'ABxyz'C6
'ABxyzz' すなわち、C2
からの'z'
I
'abcd'Z
'wxyz'BELL
07 hex Control-G、ベル
CHARACTER S*4INTEGER I2*2, I4*4REAL RS = 4HwxyzI2 = 2HyzI4 = 4HwxyzR = 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. XX、Y
ともに真X、Y
の少なくとも一方が真X、Y
ともに真ではなく、ともに偽でもないX、Y
の一方だけが真X、Y
ともに真またはともに偽論理否定
サイズが違うオペランドに対する論理演算では、結果の論理値は最大オペランドのサイズになります。たとえば
L2.AND.L4
の場合、L2
がLOGICAL*2
で、L4
がLOGICAL*4
であると、結果はLOGICAL*4
になります。
BYTE
© の変数は、LOGICAL*1
として処理されます。論理代入
v 論理変数、配列要素、または記録欄
論理代入文を実行すると論理式 e が評価され、結果の値が v に代入されます。e が (-128 と 127 の間の整数または単一の文字定数ではなく) 論理式の場合、e は真か偽のどちらかの値を持っていなければなりません。
任意のサイズの論理式を任意のサイズの論理変数に代入できます。
数値を論理値として代入することはできます (ゼロ以外のすべての値が
.TRUE.
として処理され、ゼロは.FALSE.
として処理される) が、規格外なので移植できない場合があります。©
LOGICAL B1*1, B2*1LOGICAL L3, L4B2 = B1B1 = L3L4 = .TRUE.関係演算子
関係演算子は 2 つの算術式または 2 つの文字式を比較し、結果として単一の論理値をもたらします。演算子は以下のいずれかです。
.LT..LE..EQ..NE..GT..GE. 小さい小さいか等しい等しい等しくない大きい大きいか等しい
すべての関係演算子の優先順位は同じです。文字演算子と算術演算子は関係演算子に優先します。
関係式の場合、2 つのオペランドの各々が評価され、次にその 2 つの値が比較されます。指定した関係が成り立つ場合の値は真であり、そうでない場合は偽です。
NODE .GE. 0X .LT. YU*V .GT. U-VM+N .GT. U-V
混合モード: 整数 M+N は実数になるSTR1 .LT. STR2 STR1 と STR2 は文字型S .EQ. 'a' S は文字型定数式
定数式は明示的な定数とパラメータ (定数名)、そして Fortran 演算子から構成されています。各々のオペランドは、それ自体が別の定数式、定数、定数の英字名、または定数引数によって呼び出される組み込み関数になっています。
- 定数式は定数が許可される場所ではどこでも許可されますが、
DATA
文または規格に合ったFORMAT
文の規格範囲では許可されません。- 定数式は変数書式の式で許可されます。©
- 浮動小数点のべき乗は許可されず、警告が出されます。
demo% cat ConstExpr.fparameter (T=2.0*(3.0**2.5))write(*,*) tenddemo% f77 ConstExpr.fConstExpr.f:MAIN:"ConstExpr.f", line 1: 警告:パラメータ t が定数以外に設定されていますdemo% a.out31.1769demo%記録代入
記録代入の一般的な形式は次のとおりです。©
v = e
e 記録または記録欄 v 記録または記録欄
e と v は同じ構造体を持つ必要があります。つまり、各々が同じ数の欄を持ち、対応する欄は同じ型とサイズでなければなりません。
上記の例では、最初の代入文は 1 つの記録全体 (5 つの欄全部) を別の記録に、2 番目の代入文は記録全体を記録の配列の最初の要素にコピーします。
WRITE
文は記録全体を出力し、最後の文は記録のID
欄を 82 に設定します。式の評価
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |