評価の順序

式に複数の演算子が含まれている場合に各式が評価される順序は、かっこの有無および式の演算子の優先順位によって決まります。

次の表に、優先順位が高い順に演算子を示します。優先順位が同じ演算子は同じ行に示してあります。

演算子
**
^ – (前置単項演算子)
*/
+ – (2 項演算子)
|| または !!
= ^= > < >= <= ^< ^>
&
|
注:

Open PL/I では、チルダ (~) をキャレット (^) に相当する演算子記号として使用できます。

さらに、感嘆符 (!) を縦棒 (|) に相当する演算子記号として、二重感嘆符を二重縦棒 (||) に相当する演算子記号として、それぞれ使用できます。

かっこがない式では、優先順位が高い演算子から順番に評価されます。次に例を示します。

B**3+C<D

この式は次のように評価されます。

((B**3)+C)<D

かっこがない式の同じ優先順位の演算子は、一般に左から右の順に評価されます。次に例を示します。

A*B/C

この式は次のように評価されます。

(A*B)/C

ただし、前置演算子および指数演算子 (**) は例外で、これらの演算子は右から左の順に評価されます。次に例を示します。

A**B**C

この式は次のように評価されます。

A**(B**C)

式にかっこが含まれている場合は、上記の優先順位の規則に従って、かっこで囲まれた式が先に評価されます。その結果の値が単一の作用対象として使用されます。次に例を示します。

A+B*C

この式は次のように評価されます。

A+(B*C)

これは、* の方が + よりも優先順位が高いためです。ただし、かっこを使用すると、次のように別の順序で評価できます。

(A+B)*C

すべての作用対象を評価しなくても式の結果を求めることができる場合、作用対象は必ずしも評価されません。評価されるすべての作用対象に依存するプログラムは無効であり、最適化を有効にしてコンパイルした場合や PL/I の別の実装に移した場合に予期しない結果になることがあります。同様に、評価されない作用対象に依存するプログラムも無効です。次に例を示します。

IF A = 0 | B/A = 5 THEN …

この例では、コンパイラで A = 0 かどうかを確認する前に B/A が評価される可能性があるため、式全体の結果として ZERODIVIDE 条件が発生することがあります。ただし、コンパイラでいずれの順序で評価されるかは保証されません。特に、A が実際に 0 であれば、B/A の値は計算されても計算されなくても関係ありません。このような、条件式の一部に基づいて他の「不要」な部分が評価されないことがある最適化のことを「短絡評価」と呼びます。このような評価はコンパイラおよびそのオプティマイザーによって独自に行われます。必ず先に A = 0 が評価されるようにするには、次のように書き換えます。

IF A ^= 0 THEN
   IF B/A ^= 5 THEN 
      GOTO L;
      .
      .
      .
   L:

本章の残りの部分でそれぞれの演算子について説明します。