一つの式で、複数の演算をするとき、各演算は、あらかじめ定められた順番で、値を求めて、処理されます。
これは、演算や演算子の優先順位と呼ばれます。
式で、演算子が、より上位の優先順位を持つなら、それは下位の優先順位の演算子より先に、値を求められます。
演算子の優先順位が等しいなら、これらは、その結合規則の順で、評価されます。
結合規則は、左から右か、右から左の順の、いずれかです。
規則として、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
演算子の先行が曖昧かもしれない式については、エラーの可能性を最小限にして、かつコードを読む人に分かりやすいよいように、式の該当部分を括弧で囲むことを、推奨します。
参照: