本節では、XL Fortran 式テーブルにリストされる XL Fortran 式について詳述します。 計算の優先順位については、『式の評価』を参照してください。
算術式 | 論理値 |
文字 | 1 次子 |
一般式 | 関係式 |
算術式 (arith_expr) 評価すると、数値が得られます。 arith_expr の 形式は次のとおりです。
>>-+-------------------------+--arith_term--------------------->< '-+------------+--+- + -+-' '-arith_expr-' '- - -' |
arith_term の形式は次のとおりです。
>>-+---------------------+--arith_factor----------------------->< '-arith_term--+- / -+-' '- * -' |
arith_factor の形式は次のとおりです。
>>-arith_primary--+--------------------+----------------------->< '- ** --arith_factor-' |
arith_primary は算術型の 1 次子です。
次の表は、使用可能な算術演算子と、算術式内での各演算子の 演算優先順位を示しています。
算術演算子 | 意味 | 優先順位 |
---|---|---|
** | 指数 | 1 番目 |
* | 乗算 | 2 番目 |
/ | 除算 | 2 番目 |
+ | 加算 または 恒等 | 3 番目 |
- | 減算 または 否定 | 3 番目 |
XL Fortran では、2 つ以上の加算演算子または減算演算子が含まれている算術式 の各項は、左から右に向かって評価されます。 たとえば、2+3+4 は、プロセッサーが数学的に同等で括弧が正しい 別の方法でこの式を解釈できたとしても、(2+3)+4 と評価されます。
2 つ以上の乗算演算子または除算演算子が含まれている各項を計算する場合、 因数は左から右に向かって評価されます。 たとえば、2*3*4 は (2*3)*4 のように評価されます。
2 つ以上の指数演算子を含んでいる因数が計算される場合、1 次子は 右から左に向かって評価されます。 たとえば、2**3**4 は 2**(3**4) のように評価されます。 (繰り返しになりますが、数学的に同等であるようになります。)
XL Fortran 演算優先順位の異なる演算子が 2 つ以上含まれている 算術式を計算する場合、演算子の優先順位では、計算の順序が決められます。 たとえば、式 -A**3 の場合、指数演算子 (**) の方が 否定演算子 (-) よりも優先順位が高くなります。 したがって、指数演算子のオペランドは、 否定演算子のオペランドとして使用される式を形成するために結合されます。 すなわち、-A**3 は -(A**3) と同じように評価されます。
A**-B または A*-B のように、式の中で算術演算子を 2 つ 連続することはできないことに注意してください。 ただし、A**(-B) や A*(-B) という式を使用することはできます。
式で、整数による整数の除算を指定している場合、その結果は、 ゼロに近い整数に丸められます。 たとえば、(-7)/3 は、-2 の値を持ちます。
+----------------------------------IBM 拡張----------------------------------+
浮動小数点式の計算時に発生し得る例外条件の 詳細については、「XL Fortran ユーザーズ・ガイド」の 『浮動小数点演算例外の検出とトラッピング』を参照してください。
+------------------------------End of IBM 拡張-------------------------------+
算術式 | 括弧付きの同等式 |
---|---|
-b**2/2.0 | -((b**2)/2.0) |
i**j**2 | i**(j**2) |
a/b**2 - c | (a/(b**2)) - c |
恒等演算子および否定演算子は 1 つのオペランドに対してのみ演算を行うため、 演算結果の値の型は、オペランドの型と同じになります。
次の表は、算術演算子が 1 対のオペランドに 対して演算を行った場合に得られる型を示したものです。
表記法: T(param)。ここで T はデータ型
(I: 整数、R: 実数、X: 複素数)、param は
kind 型付きパラメーターです。
| 第 2 オペランド | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
第 1 オペランド | I(1) | I(2) | I(4) | I(8) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
I(1) | I(1) | I(2) | I(4) | I(8) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
I(2) | I(2) | I(2) | I(4) | I(8) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
I(4) | I(4) | I(4) | I(4) | I(8) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
I(8) | I(8) | I(8) | I(8) | I(8) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
R(4) | R(4) | R(4) | R(4) | R(4) | R(4) | R(8) | R(16) | X(4) | X(8) | X(16) |
R(8) | R(8) | R(8) | R(8) | R(8) | R(8) | R(8) | R(16) | X(8) | X(8) | X(16) |
R(16) | R(16) | R(16) | R(16) | R(16) | R(16) | R(16) | R(16) | X(16) | X(16) | X(16) |
X(4) | X(4) | X(4) | X(4) | X(4) | X(4) | X(8) | X(16) | X(4) | X(8) | X(16) |
X(8) | X(8) | X(8) | X(8) | X(8) | X(8) | X(8) | X(16) | X(8) | X(8) | X(16) |
X(16) | X(16) | X(16) | X(16) | X(16) | X(16) | X(16) | X(16) | X(16) | X(16) | X(16) |
+----------------------------------IBM 拡張----------------------------------+
注:
INTEGER(2) I2_1, I2_2, I2_RESULT INTEGER(4) I4 I2_1 = 32767 ! Maximum I(2) I2_2 = 32767 ! Maximum I(2) I4 = I2_1 + I2_2 PRINT *, "I4=", I4 ! Prints I4=-2 I2_RESULT = I2_1 + I2_2 ! Assignment to I(2) variable I4 = I2_RESULT ! and then assigned to an I(4) PRINT *, "I4=", I4 ! Prints I4=-2 END
+------------------------------End of IBM 拡張-------------------------------+
文字式を評価すると、文字型の結果が得られます。 char_expr の形式は次のとおりです。
>>-+---------------+--char_primary----------------------------->< '-char_expr--//-' |
char_primary は、文字型の 1 次子です。 文字式の中の 1 次子はすべて、同じ kind 型付きパラメーターを持ちます。 これは、結果の kind 型付きパラメーターでもあります。
文字演算子としては、// しかなく、これは連結を表します。
1 つ以上の連結演算子が含まれている文字式の場合、1 次子が結合されて、1 つの文字ストリングになります。 文字ストリングの長さは、個々の 1 次子の長さの和に等しくなります。 たとえば、 'AB'//'CD'//'EF' は、長さ 6 文字のストリング 'ABCDEF' と評価されます。
文字式に括弧を付けても、結果の値は変わりません。
括弧で囲まれたアスタリスクで長さを宣言するとき、文字式にオペランドの連結を含めることができます。 これは、継承された長さを示します。 この場合、実際の長さは継承された長さの文字ストリングを使用して宣言するかどうかによって異なります。
CHARACTER(7) FIRSTNAME,LASTNAME FIRSTNAME='Martha' LASTNAME='Edwards' PRINT *, LASTNAME//', '//FIRSTNAME ! Output:'Edwards, Martha' END
一般式の形式 (general_expr) は次のとおりです。
>>-+---------------------------------+--expr------------------->< '-general_expr--defined_binary_op-' |
4 種類の組み込み式とは、算術式、文字式、関係式、論理式です。
論理式 (logical_expr) を評価すると、論理型の結果が得られます。 論理式の形式は次のとおりです。
>>-+------------------------------+--logical_disjunct---------->< '-logical_expr--+-.EQV.------+-' +-.NEQV.-----+ | (1) | '-.XOR.------' 注:
|
logical_disjunct の形式は、次のとおりです。
>>-+------------------------+--logical_term-------------------->< '-logical_disjunct--.OR.-' |
logical_term の形式は、次のとおりです。
>>-+---------------------+--logical_factor--------------------->< '-logical_term--.AND.-' |
logical_factor の形式は、次のとおりです。
>>-+--------------------------------+-------------------------->< '-+-------+--+-logical_primary-+-' '-.NOT.-' '-rel_expr--------' |
logical_primary は論理型の 1 次子です。
rel_expr は関係式です。
論理演算子には、次のものがあります。
論理演算子 | 意味 | 優先順位 |
---|---|---|
.NOT. | 論理否定 | 1 番目 (最上位) |
.AND. | 論理積 | 2 番目 |
.OR. | 包括的論理和 | 3 番目 |
.XOR. (注 * を参照。) | 排他的論理和 | 4 番目 (最下位) (注 * を参照。) |
.EQV. | 論理等価 | 4 番目 (最下位) |
.NEQV. | 論理非等価 | 4 番目 (最下位) |
+----------------------------------IBM 拡張----------------------------------+
.XOR. 演算子は、-qxlf77=intxor コンパイラー・オプションを 指定した場合にのみ、組み込み演算子として扱われます。 (詳細については、「XL Fortran ユーザーズ・ガイド」 の『-qxlf77 オプション』を参照してください。) それ以外の場合は、定義済み演算子として扱われます。 .XOR. を組み込み演算子として扱う場合、 総称インターフェースにより、.XOR. を拡張することもできます。
+------------------------------End of IBM 拡張-------------------------------+
優先順位の異なる 2 つ以上の演算子が含まれている 論理式を評価する場合、演算子の優先順位によって計算の順序が決められます。 たとえば、A.OR.B.AND.C という 式は、A.OR.(B.AND.C) のように計算されます。
x1 および x2 が論理値であると
仮定した場合、次の表を使って論理式の値を決めます。
x1 | .NOT. x1 |
---|---|
真 | 偽 |
偽 | 真 |
x1 | x2 | .AND. | .OR. | .XOR. | .EQV. | .NEQV. |
---|---|---|---|---|---|---|
偽 | 偽 | 偽 | 偽 | 偽 | 真 | 偽 |
偽 | 真 | 偽 | 真 | 真 | 偽 | 真 |
真 | 偽 | 偽 | 真 | 真 | 偽 | 真 |
真 | 真 | 真 | 真 | 偽 | 真 | 偽 |
論理式の値を求めるとき、必ずしも式全体が計算されなくてもよい場合があります。 次のような論理式を考えてみてください。 (LFCT が論理型の関数であるとします。)
A .LT. B .OR. LFCT(Z)
A が B より小さい場合は、 関数参照が計算されなくても、この式が真であることがわかります。
XL Fortran は、n が kind 型付きパラメーター である LOGICAL(n) または INTEGER(n) の結果に対して、 論理式を評価します。 n の値は各オペランドの kind パラメーターによって異なります。
単項論理演算子 .NOT. の場合、 デフォルトでは、n はオペランドの kind パラメーターによって異なります。 たとえば、オペランドが LOGICAL(2) のとき、結果 も LOGICAL(2) になります。
次の表に単項演算の結果の型を示します。
オペランド | 単項演算の結果 |
---|---|
* BYTE | INTEGER(1) * |
LOGICAL(1) | LOGICAL(1) |
LOGICAL(2) | LOGICAL(2) |
LOGICAL(4) | LOGICAL(4) |
LOGICAL(8) | LOGICAL(8) |
* Typeless | Default integer * |
2 つのオペランドの長さが同じである場合は、n はその長さになります。
+----------------------------------IBM 拡張----------------------------------+
単なる kind パラメーターを持つ 2 進論理演算の場合、 式の kind パラメーターは 2 つのオペランドのうちの長い方と同じになります。 たとえば、1 つのオペランドが LOGICAL(4) で、 もう一方が LOGICAL(2) のとき、結果は LOGICAL(4) になります。
+------------------------------End of IBM 拡張-------------------------------+
次の表に 2 進演算の結果の型を示します。
| 第 2 オペランド | |||||
---|---|---|---|---|---|---|
第 1 オペランド | *BYTE | LOGICAL(1) | LOGICAL(2) | LOGICAL(4) | LOGICAL(8) | *Typeless |
*BYTE | *INTEGER(1) | *LOGICAL(1) | *LOGICAL(2) | *LOGICAL(4) | *LOGICAL(8) | *INTEGER(1) |
LOGICAL(1) | LOGICAL(1) | LOGICAL(1) | LOGICAL(2) | LOGICAL(4) | LOGICAL(8) | LOGICAL(1) |
LOGICAL(2) | LOGICAL(2) | LOGICAL(2) | LOGICAL(2) | LOGICAL(4) | LOGICAL(8) | LOGICAL(2) |
LOGICAL(4) | LOGICAL(4) | LOGICAL(4) | LOGICAL(4) | LOGICAL(4) | LOGICAL(8) | LOGICAL(4) |
LOGICAL(8) | LOGICAL(8) | LOGICAL(8) | LOGICAL(8) | LOGICAL(8) | LOGICAL(8) | LOGICAL(8) |
*Typeless | *INTEGER(1) | *LOGICAL(1) | *LOGICAL(2) | *LOGICAL(4) | *LOGICAL(8) | *Default Integer |
式の結果がデフォルトの整数として扱われ、 その値がデフォルト整数の値の範囲内に表示できない場合、 定数は表示可能な形にされます。
1 次子の形式は、次のとおりです。
>>-+------------------+--primary------------------------------->< '-defined_unary_op-' |
関係式 (rel_expr) を評価すると、論理型の結果が得られます。 関係式は、論理式が指定できる任意の箇所で指定できます。 関係式は、算術関係式または文字関係式です。
算術関係式は、2 つの算術式の値を比較します。 式の形式は次のとおりです。
>>-arith_expr1--relational_operator--arith_expr2--------------->< |
関係演算子 | 意味 |
---|---|
.LT. または < | より小 |
.LE. または <= | 以下 |
.EQ. または == | 等しい |
.NE. または *<> または /= | 等しくない |
.GT. または > | より大 |
.GE. または >= | 以上 |
演算子で指定された関係をオペランドの各値が満足する場合のその演算関係式の論理 値は、.true. であると解釈されます。 指定された関係をオペランドの値が満足していない場合には、 算術関係式の論理値は、.false. になります。
式の型または kind 型付きパラメーターが異なる場合、 その式の値は計算の前にその式 (arith_expr1 + arith_expr2) の型 および kind 型付きパラメーターに変換されます。
IF (NODAYS .GT. 365) YEARTYPE = 'leapyear'
文字関係式は、2 つの文字式の値を比較します。式の形式は次のとおりです。
>>-char_expr1--relational_operator--char_expr2----------------->< |
どのような関係演算子の場合でも、文字関係式の解釈には、照合順序を使用します。 照合順序の低い値を持つ文字式の方が、 高い値を持つ文字式よりも小さいと見なされます。 文字式は、1 度に 1 文字ずつ、左から右に向かって評価されます。 組み込み関数 (LGE、LLT、および LLT) を使用して、 ASCII コードによる照合順序で指定された文字ストリングを比較することもできます。 どのような関係演算子の場合でも、オペランドの長さが等しくなければ 短い方のオペランドの右側にブランクが追加されます。 char_expr1 および char_expr2 の長さが 両方ともゼロの場合、これらは等しいと評価されます。
+----------------------------------IBM 拡張----------------------------------+
char_expr1 および char_expr2 が XL Fortran のマルチバイト文字 (MBCS) の場合でも、ASCII コードによる照合順序が使用されます。
+------------------------------End of IBM 拡張-------------------------------+
IF (CHARIN .GT. '0' .AND. CHARIN .LE. '9') CHAR_TYPE = 'digit'