演算子と優先順位

次の表は、EGL の演算子を優先順位の高い順にリストしたものです。 一部の演算子は、コンテキストによって複数の意味を持ちます。 EGL では、特殊文字を使用して、型の拡張 (『型拡張文字』を参照) や区切り文字 (『区切り文字』を参照) を表すことがあります。

この表には、代入演算子 (=) または複合代入演算子 (+= など) は含まれていません。 これらの特別なケースについて詳しくは、『代入』を参照してください。

演算子 (コンマ区切り) 意味
. メンバー・アクセス演算子 (ドット) は、レコード内フィールド、ライブラリー内関数、変数内プロパティーなどのエンティティーのメンバーへのアクセスを提供します。複数レベルでの修飾が可能です。 左から右に移動するに従い、メンバーが特定されていきます。
@ @ 演算子は、名前がフィールド以外のプロパティーを参照していることを示します。
new new 演算子は、参照変数 (値ではなくアドレスを含む変数) 用に constructor 関数 (新規変数を作成する特殊関数) を呼び出します。これは、ExternalType パーツでの場合を除き、パラメーターをとらないデフォルトのコンストラクターです。『new 演算子』を参照してください。
[] 配列にアクセスする演算子 (大括弧) は、配列名からインデックス値を、または文字変数名からサブストリング値を分離します。 a[x] は配列添え字であり、b[x:y] はサブストリングです。
+, - 単項のプラス (+) やマイナス (-) は、オペランドや括弧で囲まれた式の前に付く符号であり、2 つの式の間に使用される演算子ではありません。
** ** は、指数演算子であり、「累乗」と解釈されます。例えば、c = a**b は、a の b 乗の値が c に代入されることを示します。 第 1 オペランド (上の例では a) は、負の値にできない FLOAT です。 第 2 オペランド (上の例では b) は FLOAT リテラルまたは FLOAT 変数、正、負、0 です。
*/&|xor 乗算 (*)、整数除算 (/)、および 3 つのビット単位演算の優先順位は、等しくなっています。 整数の除算結果は、小数値になることがあります。例えば、7/5 は 1.4 になります。

ビット単位演算子 AND (&)、OR (|)、および 排他 OR (xor) は、2 つのオペランド間のビット単位演算を実行し、INT 型の値を戻します。 オペランドは、HEX(2)、HEX(4)、HEX(8)、INT、または SMALLINT のいずれかの型です。 演算は、すべての HEX または SMALLINT のオペランドを INT 型に変換して開始します。 HEX の場合、演算では長さが 4 バイトになるまでオペランドの値をゼロで左詰めで埋め込みます。

% % は、剰余演算子です。2 つのオペランドまたは数値表現の第 1 のものを第 2 のもので除算するときのモジュラスに解決されます。 例えば、7%5 は 2 になります。
+, - 加算 (+) および減算 (-) は、優先順位の等しい 2 項演算 (2 つのオペランドが必要) です。
as キャスト演算子は、第 1 オペランドの型 (第 2 オペランド) を指定します。『as 演算子』を参照してください。
::, ?:, + EGL は 2 つの演算子 (:: および ?:) を、連結専用に使用します。 正符号 (+) もまた、連結演算子として使用されます。両者の違いについては、『連結演算子』を参照してください。
==!=<><=>=isa 論理型比較用の論理演算子は、どれも同じ優先順位です。 これらの演算子のいずれかを持つそれぞれの式を評価すると、TRUE または FALSE になります。
! ! は、not 演算子であり、EGL が直後の論理式の値を反転したブール値 (true または false) に評価します。この演算子の後ろにくる式は、括弧で囲む必要があります。
isnotinlikematches 比較に用いられるこれらの論理演算子は、いずれも等しい優先順位を持ちます。これらの演算子のいずれかを含む各式は、TRUE または FALSE として評価されます。『in 演算子』、『like 演算子』、『matches 演算子』をそれぞれ参照してください。
&&and && (and とも記述される) は、「両方が true でなければならない」ことを意味します。 and 演算子の両辺にある論理式が両方とも true の場合、その式は TRUE として解決されます。 それ以外の場合、式は FALSE として解決されます。
||or || (or とも記述される) は、「どちらか一方、または両方」を意味します。 or 演算子の両辺にある論理式が両方とも false の場合、その式は FALSE として解決されます。 それ以外の場合、式は TRUE として解決されます。

優先順位の規則に従わない場合、以下の例で示すように、予期しないエラーが発生する可能性があります。

最初の例では、開発者は、減算の方が乗算よりも優先順位が高いと誤って思い込んでいます。
n NUM(3) = 100 - 98 * 100;
EGL は、式の右側を 100 - (98 * 100) として構文解析し、以下に示すように、NUM(3) には大きすぎる結果が生成されます。
EGL0049E 値 -9,700 を n に割り当てる際に、オーバーフロー・エラーが発生しました。
2 番目の例では、開発者は、element が配列 myArray のメンバーでない場合、次の式は true であると見込みます。
if (!element in myArray)

その意図に反して、「not」演算子が in 演算子より優先順位が高いため、EGL は配列で false 値を検索します。これは開発者が予期しなかったことです。

次のように、両方のケースで、意図する優先順位を括弧を使用して強制すると、このようなエラーが回避されるのみではなく、コードの信頼性も高まります。
n NUM(3) = (100 - 98) * 100;
if (!(element in myArray))

互換性

表 1. 演算子の互換性に関する考慮事項
プラットフォーム 問題
COBOL 生成と Java™ 生成 剰余演算子 (%) は、COBOL と Java 間において、両方のオペランドが整数である場合、その結果には一貫性があります。しかし、オペランドに小数部が含まれている場合、 この 2 つの言語は別々の丸めアルゴリズムを採用するため、両者の剰余は異なる場合があります。
JavaScript 生成 3 つのビット単位演算子 (&|、および Xor) はサポートされません。in 演算子もサポートされません。

フィードバック