一つの式で、複数の演算をするとき、各演算は、あらかじめ定められた順番で、値を求めて、処理されます。
これは、演算や演算子の優先順位と呼ばれます。
式で、演算子が、より上位の優先順位を持つなら、それは下位の優先順位の演算子より先に、値を求められます。
演算子の優先順位が等しいなら、これらは、その結合規則の順で、評価されます。
結合規則は、左から右か、右から左の順の、いずれかです。
規則として、2項演算子(
+,
^ など)、および単項の接尾辞演算子(
(),
-> など)は、左から右に値を求めます。
単項の単項演算子(
Not,
@ など)は、右から左に値を求めます。
結合規則が、「なし」の演算子は、この演算子が使われる式が、優先順位や結合規則によって、操作の順序がチェックされる必要がある所で、登場しないことを意味しています。
Cast など、関数のような演算子は、それらの構文で必要とされる括弧のために、いつも最初に値を求められます。
そして、代入演算子は、いつも最後に値を求められます。
丸括弧は、演算子の優先順位をくつがえすために、使えます。
丸括弧の中の演算は、他の操作の前に、実行されます。
丸括弧の中では、通常の演算子の優先順位が、使用されます。
下の表は、演算子の優先順位を、最も優先順位の高いものから、最も低いものまで、順に記載しています。
表の中の、演算子の項目が空白の行は、等しい優先順位を持っている演算子のグループを、現しています。
最も高い優先順位
| 演算子 |
内容 |
結合規則 |
|
|
|
| CAST |
型変換 |
なし |
| PROCPTR |
手続きポインタ |
なし |
| STRPTR |
文字列ポインタ |
なし |
| VARPTR |
変数ポインタ |
なし |
|
配列関連 |
|
| [] |
文字列インデックス |
左から右 |
| [] |
ポインタ・インデックス |
左から右 |
| () |
配列インデックス |
左から右 |
| () |
関数呼び出し |
左から右 |
| . |
メンバーアクセス |
左から右 |
| -> |
メンバーアクセスへのポインタ |
左から右 |
|
ポインタ関連 |
|
| @ |
のアドレス |
右から左 |
| * |
の値 |
右から左 |
| New |
メモリを割り当て |
右から左 |
| Delete |
メモリの割り当てを解除 |
右から左 |
|
算術演算 |
|
| ^ |
べき乗 |
左から右 |
|
|
|
| - |
否定 |
右から左 |
|
|
|
| * |
乗算 |
左から右 |
| / |
除算 |
左から右 |
|
|
|
| \ |
整数除算(余り切り捨て) |
左から右 |
|
|
|
| MOD |
剰余(まるめ) |
左から右 |
|
|
|
| SHL |
左にシフト(移行) |
左から右 |
| SHR |
右にシフト(移行) |
左から右 |
|
|
|
| + |
足す(加法) |
左から右 |
| - |
引く(減法) |
左から右 |
|
|
|
| & |
文字列連結 |
左から右 |
|
|
|
| Is |
実行時型情報チェック |
なし |
|
|
|
| = |
同等(一致) |
左から右 |
| <> |
等しくない(不一致) |
左から右 |
| < |
少なり(未満) |
左から右 |
| <= |
以下 |
左から右 |
| >= |
以上 |
左から右 |
| > |
大なり |
左から右 |
|
論理演算 |
|
| NOT |
否定(補数) |
右から左 |
|
|
|
| AND |
論理積(結合) |
左から右 |
|
|
|
| OR |
論理和 |
左から右 |
|
|
|
| EQV |
同値 |
左から右 |
| IMP |
包含 |
左から右 |
| XOR |
排他的論理和 |
左から右 |
|
|
|
| ANDALSO |
短絡論理積(短絡結合) |
左から右 |
| ORELSE |
短絡論理和(短絡包含的選言) |
左から右 |
|
複合代入演算子 |
|
| =[>] |
代入 |
なし |
| &= |
連結して代入 |
なし |
| += |
加えて代入 |
なし |
| -= |
引いて代入 |
なし |
| *= |
掛けて代入 |
なし |
| /= |
割って代入 |
なし |
| \= |
整数除算して代入 |
なし |
| ^= |
べき乗して代入 |
なし |
| MOD= |
剰余値を代入 |
なし |
| AND= |
論理積値を代入 |
なし |
| EQV= |
論理等価値を代入 |
なし |
| IMP= |
論理包含値を代入 |
なし |
| OR= |
論理和値を代入 |
なし |
| XOR= |
排他的論理和値を代入 |
なし |
| SHL= |
左シフトして代入 |
なし |
| SHR= |
右シフトして代入 |
なし |
| LET |
代入 |
なし |
|
|
|
| LET() |
代入 |
なし |
最も低い優先順位
いつくかのケースで、優先順位が、混乱させるか直観に反した結果を引き起こすことがあります。
下に、いくつかの例を掲示します:
'' 負数をべき乗しようとする
-2 ^ 2
期待する結果: (-2) ^ 2 = 4
実際の 結果: -(2 ^ 2) = -4
'' trying to test a bit in a number
n And 1 <> 0
期待する結果: (n And 1) <> 0
実際の 結果: n And (1 <> 0)
'' trying to shift a number by n+1 bits
a Shl n+1
期待する結果: a Shl (n + 1)
実際の 結果: (a Shl n) + 1
演算子の先行が曖昧かもしれない式については、エラーの可能性を最小限にして、かつコードを読む人に分かりやすいよいように、式の該当部分を括弧で囲むことを、推奨します。
参照: