1 つの演算式の中で、各種演算を組み合わせることができます。 どのような組み合わせでもかまいません。
以下に例を示します。
declare Result bit(3),
A fixed decimal(1),
B fixed binary (3),
C character(2), D bit(4);
Result = A + B < C & D;
この式の中の計算は、それぞれの計算の規則に従って実行されますが、 その前に、下記のように必要とするデータ変換が行われます。
この例の式は、左から右へ順に計算を行うように記述されています。 ただし、計算の順序は、式の中に書かれている演算子の優先順位によって決まります。
式を計算するときの演算子の優先順位は、表 21 に示すとおりです。
| 優先度 | 演算子 | 演算のタイプ | 注釈 |
|---|---|---|---|
| 1 | ** | 算術 | 結果はコード化算術フォーマットです。 |
| 接頭演算子 +、- | 算術 | オペランドがコード化算術フォーマットであれば、変換は不要です。 | |
| オペランドが CHARACTER ストリングまたは数字 (PICTURE) 表記の固定小数点 10 進数であれば、FIXED DECIMAL に変換されます。 | |||
| オペランドが数字 (PICTURE) 表記の 10 進浮動小数点数であれば、FLOAT DECIMAL に変換されます。 | |||
| オペランドが BIT ストリングであれば、FIXED BINARY に変換されます。 | |||
| 接頭演算子 ¬ | ビット・ストリング | BIT 以外のデータはすべて BIT に変換されます。 | |
| 2 | *, / | 算術 | 結果はコード化算術フォーマットです。 |
| 3 | 挿入演算子 +、- | 算術 | 結果はコード化算術フォーマットです。 |
| 4 | || | 連結 | RULES(ANS) のもとでの結果および RULES(IBM) のもとでの結果を参照してください。 |
| 5 | <, ¬<, <=, =, ¬=, >=, >, ¬> | 比較 | 結果は常に '1'B または '0'B です。 |
| 6 | & | ビット・ストリング | BIT 以外のデータはすべて BIT に変換されます。 |
| 7 | ビット・ストリング | BIT 以外のデータはすべて BIT に変換されます。 | |
| 挿入演算子 ¬ | ビット・ストリング | BIT 以外のデータはすべて BIT に変換されます。 |
次の式の計算順序は、
A + B < C & D
下記のように式の各エレメントを括弧で囲んだ場合と同じです。
(((A + B) < C) & D)
式の計算順序 (したがって、その結果も) は、括弧を使用して変えることができます。 括弧で囲まれている式が最初に計算されて 1 つの値が求められ、次にその前後にある演算子に関係づけられています。
例えば、上記の式を次のように変えることができます。
(A + B) < (C & D)
A の値が固定小数点 2 進数に変換されてから、 加算が行われ、固定小数点 2 進数の結果 (result_1) が生成されます。 C の値がビット・ストリングに変換され、 (このように変換できる場合) AND 演算が行われます。 この時点で、上の式は次のよう縮小されます。
Result_1 < Result_2
result_2 が 2 進数に変換されてから、 代数比較が行われ、式全体の演算結果として長さ 1 のビット・ストリングが生成されます。
演算子の優先順位は、オペランド間 (またはサブオペランド間) の関係で決められます。 次の例を考えてみてください。
A + (B < C) & (D || E ** F)
この場合、PL/I では、 累乗演算を連結より先に実行するということだけが定められています。 (D||E ** F) の計算と 他方のオペランド (A + (B < C)) の計算との 順序関係は定められていません。
どのような演算式 (接頭演算子の式を除く) も、最終的には、単一の挿入演算子演算に変形されるものでなければなりません。 その最終的な演算のオペランドと演算子によって、式全体の計算結果の属性が決まります。 次の例では、& 演算子は、最終段階の挿入演算子演算の演算子です。
A + B < C & D
計算結果は長さ 4 のビット・ストリングになります。
次の例では、括弧で囲まれているため、 最終段階の挿入演算子演算の演算子が比較演算子になります。
(A + B) < (C & D)
計算結果は長さ 1 のビット・ストリングになります。