この項では、最小から最大までの評価優先順位にしたがって式のレベルを表しています。
一般式の形式 (general_expr) は次のとおりです。
>>-+---------------------------------+--expr------------------->< '-general_expr--defined_binary_op-' |
4 種類の組み込み式とは、算術式、文字式、関係式、論理式です。
算術式 (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 拡張----------------------------------+
浮動小数点式の計算時に発生し得る例外条件の詳細については、「ユーザーズ・ガイド」の『浮動小数点演算例外の検出とトラップ』を参照してください。
+--------------------------------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=65534" 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
+--------------------------------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
関係式 (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 コードによる照合順序が使用されます。
+--------------------------------IBM 拡張の終り-------------------------------+
IF (CHARIN .GT. '0' .AND. CHARIN .LE. '9') CHAR_TYPE = 'digit'
論理式 (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 コンパイラー・オプションを指定した場合にのみ、組み込み演算子として扱われます。 (詳細については、「ユーザーズ・ガイド」の『-qxlf77 オプション』を参照してください。) それ以外の場合は、定義済み演算子として扱われます。 .XOR. を組み込み演算子として扱う場合、総称インターフェースにより、.XOR. を拡張することもできます。
+--------------------------------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) |
* タイプなし | デフォルトの整数 * |
2 つのオペランドの長さが同じである場合は、n はその長さになります。
+----------------------------------IBM 拡張----------------------------------+
異なる kind パラメーターを持つオペランドが指定された 2 進論理演算の場合、式の kind 型付きパラメーターは 2 つのオペランドのうちの長い方と同じになります。たとえば、1 つのオペランドが LOGICAL(4) で、もう一方が LOGICAL(2) のとき、結果は LOGICAL(4) になります。
+--------------------------------IBM 拡張の終り-------------------------------+
次の表に 2 進演算の結果のタイプを示します。
| 第 2 オペランド | |||||
---|---|---|---|---|---|---|
第 1 オペランド | *BYTE | LOGICAL(1) | LOGICAL(2) | LOGICAL(4) | LOGICAL(8) | *タイプなし |
*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) |
*タイプなし | *INTEGER(1) | *LOGICAL(1) | *LOGICAL(2) | *LOGICAL(4) | *LOGICAL(8) | *デフォルトの整数 |
式の結果がデフォルトの整数として扱われ、その値がデフォルト整数の値の範囲内で表現できない場合、定数は表現可能な形にされます。
1 次子の形式は、次のとおりです。
>>-+------------------+--primary------------------------------->< '-defined_unary_op-' |