式には、複数の種類の演算子を入れることができます。
その場合、式は、次のような演算子の優先順位に従って、
左から右に向かって評価されます。
- 定義済み単項
- 算術演算子
- 文字
- 関係演算子
- 論理
- 定義済み 2 進演算子
たとえば、次のような論理式があるとします。
L .OR. A + B .GE. C
ここで、L が論理型で A、B、C が実数型だとすると、その式は以下の論理式と同じように
評価されます。
L .OR. ((A + B) .GE. C)
拡張組み込み演算子は、その優先順位を維持します。
つまり演算子は、定義済み単項演算子または定義済み 2 進演算子にはなりません。
演算子を使った 1 次子は、次の順序で組み合わせられます。
- 括弧を使用する
- 演算子の優先順位
- 因数内の指数を右から左に向かって解釈する
- 項内の乗算および除算を左から右に向かって解釈する
- 算術式内の加算および減算を左から右に向かって解釈する
- 文字式内の連結を左から右に向かって解釈する
- 論理項内の論理積を左から右に向かって解釈する
- 論理和内の論理和を左から右に向かって解釈する
- 論理式内の論理等価を左から右に向かって解釈する
算術式、文字式、関係式、論理式は、次の規則に従って評価されます。
- 変数または関数は、その使用時に定義しておく必要があります。
整数オペランドは、ステートメント・ラベル値ではなく、整数値で定義してください。
文字データ・オブジェクト内で参照される文字または、
配列や配列セクション内で参照される配列エレメントは、すべて参照実行時に定義します。
構造体のすべてのコンポーネントを、構造体が参照されるときに定義する必要があります。
ポインターは、定義済みターゲットと関連します。
配列エレメントの参照、配列セクションの参照、および添え字の参照を実行するには、
そのセクション添え字、およびサブストリング式の計算が必要となります。
配列エレメント添え字、セクション添え字、
サブストリング式の計算や、配列コンストラクターの暗黙 DO の境界
およびストライドは影響を受けることはありません。
また、配列を含んでいる式の型にも影響しません。
配列にかかわる式を参照してください。
計算結果の値が実行可能プログラム内で数学的に定義されていない
定数整数演算または浮動小数点演算は使用できません。
このような式が定数以外のもので実行された場合、式は実行時に検出されます。
(たとえば、ゼロ除算、またはゼロ値の 1 次子に対するゼロ値または負数値の累乗演算)。
または、負数の 1 次子に対して実数レベルでの累乗演算を行うこともできません。
- ステートメント内で関数を呼び出した場合、
それが関数参照のあるステートメント内の他のエンティティーの計算に影響を与えたり、
そのような計算によって影響を受けるようなことがあってはなりません。
ある式の値が真の場合に、
論理 IF ステートメントまたは WHERE ステートメントの
式の中で関数参照を呼び出すと、
実行されるステートメント内のエンティティーに影響を与える場合があります。
関数参照によって関数の実引き数が定義または未定義にされる場合、
その引き数または関連するエンティティーを同じステートメント内の
他の場所に指定してはなりません。
指定してはならないステートメントの例を次に示します。
A(I) = FUNC1(I)
Y = FUNC2(X) + X
上記のようなステートメントは、FUNC1 の参照によって I が
定義される場合、または FUNC2 の参照によって X が
定義される場合には使用できません。
関数の実引き数の計算は、その関数参照を含んでいる式のデータ型
によって影響を受けることはありません。
また、関数参照を含んでいる式の
データ型は、関数の実引き数の計算によって影響を受けることはありません。
- ステートメント関数参照の引き数をその参照の計算によって変えることはできません。
+----------------------------------IBM 拡張----------------------------------+
コンパイラー・オプションの中には最終結果のデータ型に
影響を与えるものもあります。
- -qintlog コンパイラー・オプションを
使用すると、式およびステートメント内で整数と論理値を
混在させることができます。
その計算結果のデータ型および kind 型付きパラメーター
は、関係するオペランドと演算子によって異なります。
一般的には、以下のようになります。
- 論理単項演算子 (.NOT.) および算術単項演算子 (+、-) の場合
オペランドのデータ型
| 単項演算の結果のデータ型
|
BYTE
| INTEGER(1)
|
INTEGER(n)
| INTEGER(n)
|
LOGICAL(n)
| LOGICAL(n)
|
型なし
| デフォルトの整数
|
この場合の n は、kind 型付きパラメーターを表します。 n は、
-qintlog がオンの場合でも、論理定数と置換できません。また、
-qctyplss がオンの場合でも、文字定数と置換できません。
さらに n を型なし定数にすることもできません。INTEGER および LOGICAL データ型の
場合、結果の長さはオペランドの kind 型付きパラメーターの長さと同じになります。
- 2 進論理演算子 (.AND.、
.OR.、
.XOR.、
.EQV.、
.NEQV.)
および算術 2 進演算子 (**、
*、
/、
+、
-) に関して、
次の表に結果のデータ型の種類をまとめてあります。
| 第 2 オペランド
|
第 1 オペランド
| BYTE
| INTEGER(y)
| LOGICAL(y)
| 型なし
|
---|
BYTE
| INTEGER(1)
| INTEGER(y)
| LOGICAL(y)
| INTEGER(1)
|
INTEGER(x)
| INTEGER(x)
| INTEGER(z)
| INTEGER(z)
| INTEGER(x)
|
LOGICAL(x)
| LOGICAL(x)
| INTEGER(z)
| LOGICAL(z)
| LOGICAL(x)
|
型なし
| INTEGER(1)
| INTEGER(y)
| LOGICAL(y)
| デフォルトの整数
|
- 注:
- z は、結果の kind 型付きパラメーター
であり、z は、x と y のうちの大きい方に等しくなります。
たとえば、LOGICAL(4) 型のオペランドおよ
び INTEGER(2) 型のオペランドを持つ論理式の
結果型は、INTEGER(4) になります。
2 進論理演算子 (.AND.、
.OR.、
.XOR.、
.EQV.、
.NEQV.) の場合、
整数型のオペランドと論理型のオペランド間または 2 つの
整数型のオペランド間の論理演算の結果は、整数型になります。結果の kind 型付きパラメーターは、2 つのオペランドのうちの長い方の長さになります。 2 つのオペランドのパラメーターが同じである場合、結果の kind パラメーターは、
その kind パラメーターになります。
- -qlog4 コンパイラー・オプションを使用し、デフォルトの整数サイズ
が INTEGER(4) の場合は、論理演算の論理結果は、
上記の表に示す LOGICAL(n) でなく、
型 LOGICAL(4) になります。
-qlog4 オプションを指定し、デフォルトの整数サイズ
が INTEGER(4) でない場合は、
その結果は上記の表に指定したものと同じになります。
- -qctyplss コンパイラー・オプションを指定すると、XL Fortran は、
文字定数式をホレリス定数として扱います。オペランドのいずれか一方または両方が文字定数式である場合は、
その結果のデータ型と長さは、文字定数式がホレリス定数で
ある場合と同じになります。
結果のデータ型と長さについては、
前記の表の『型なし』の行を参照してください。
コンパイラー・オプションの内容については、「XL Fortran ユーザーズ・ガイド」の
『XL Fortran コンパイラー・オプションに関する参照事項』を参照してください。
+------------------------------End of IBM 拡張-------------------------------+
+----------------------------------IBM 拡張----------------------------------+
BYTE 型のデータ・オブジェクトは、
LOGICAL(1)、CHARACTER(1)、
または INTEGER(1) データ・オブジェクト
が使用できるところであればどこでも使用することができます。
BYTE データ・オブジェクトのデータ型は、
それを使用するコンテキストによって決まります。
XL Fortran は、使用前には変換を行いません。
たとえば、名前付き定数の型は、最初に
割り当てられた値によってではなく、使用することによって決まります。
- BYTE データ・オブジェクトの 2 進の算術演算子、
論理演算子、関係演算子のオペランドとして使用すると、
データ・オブジェクトのデータ型は次のようになります。
- その他のオペランドが算術、BYTE、
または型なし定数の場合、INTEGER(1) データ型
- その他のオペランドが論理定数の場合、LOGICAL(1) データ型
- その他のオペランドが文字定数の場合、CHARACTER(1) データ型
- BYTE データ・オブジェクトを連結演算子のオペランドとして
使用すると、データ・オブジェクトのデータ型
は、CHARACTER(1) になります。
- BYTE データ・オブジェクトを明示インターフェースを使用する
プロシージャーに対する実引き数として使用すると、
データ・オブジェクトのデータ型は対応する仮引き数
の型になります。
- INTEGER(1) 仮引き数の場合、INTEGER(1)
- LOGICAL(1) 仮引き数の場合、LOGICAL(1)
- CHARACTER(1) 仮引き数の場合、CHARACTER(1)
- BYTE データ・オブジェクトを、暗黙インターフェースを
使用する外部サブプログラムに対する実引き数 (参照によって
渡されている) として使用すると、そのデータ・オブジェクトは、1 バイトの
長さになり、データ型は想定されません。
- BYTE データ・オブジェクトを値 (%VAL) によって
渡される実引き数として使用すると、
データ・オブジェクトのデータ型は、INTEGER(1) になります。
- BYTE データ・オブジェクトを、算術、論理、または
文字のいずれかの特定のデータ型を必要とするコンテキストの中で
使用すると、そのデータ・オブジェクトのデータ型は、
それぞれ INTEGER(1)、LOGICAL(1)、また
は CHARACTER(1) になります。
- BYTE 型のポインターを、文字型のターゲットに
関連させることはできません。
また、文字型のポインターを BYTE 型のターゲットに
関連させることもできません。
- BYTE データ・オブジェクトをその他のコンテキスト
の中で使用する場合、データ・オブジェクトのデータ型
は、INTEGER(1) になります。
+------------------------------End of IBM 拡張-------------------------------+
