演算子の優先順位と結合性により、演算子を処理する順序が決まります。 算術プログラミングに慣れている開発者にとって、コンパイラーが乗算(*)演算子を加算(+)演算子より先に処理するのは自然なことですが、コンパイラーは、どの演算子を最初に処理するかについて明示的な指示を必要とします。このような指示を、総称して演算子の優先順位と呼びます。ActionScript では、括弧(())を使用して変更できる、演算子のデフォルトの優先順位が定義されています。例えば、次のコードは、前の例のデフォルトの優先順位を変更して、乗算演算子の前に加算演算子を処理するようにコンパイラーに強制します。
var sumNumber:uint = (2 + 3) * 4; // uint == 20
同じ優先順位の複数の演算子が同じ式にある状況があります。 このような状況では、コンパイラーは結合性のルールを使用して、最初に処理する演算子を決定します。代入演算子を除くすべてのバイナリ演算子は左結合となります。つまり、左にある演算子が右にある演算子よりも先に処理されます。代入演算子と条件(?:)演算子は右結合となります。つまり、右にある演算子が左にある演算子よりも先に処理されます。
例えば、「より小さい」(<)および「より大きい」(>)演算子について考えてみます。これらの演算子の優先順位は同じです。両方の演算子を同じ式で使用すると、左の演算子が最初に処理されます。これは、両方の演算子が左結合であるためです。 つまり、次の 2 つのステートメントでは同じ出力が得られます。
trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false
「より大きい」演算子が最初に処理され、その結果は値 true になります。これはオペランド 3 がオペランド 2 より大きいためです。次に、値 true がオペランド 1 と共に「より小さい」演算子に渡されます。次のコードは、この中間状態を表します。
trace((true) < 1);
「より小さい」演算子は、値 true を数値 1 に変換し、この数値を 2 番目のオペランド 1 と比較して、値 false を返します(つまり、値 1 は 1 より小さくない)。
trace(1 < 1); // false
デフォルトの左結合を括弧演算子を使用して変更できます。 演算子とオペランドを括弧で囲んで、「より小さい」演算子を最初に処理するようにコンパイラーに指示できます。 次の例では、括弧演算子を使用して、前の例と同じ数値で異なる出力を生成します。
trace(3 > (2 < 1)); // true
「より小さい」演算子が最初に処理され、その結果は値 false になります。これは、オペランド 2 がオペランド 1 より小さくないためです。次に、値 false がオペランド 3 と共に「より大きい」演算子に渡されます。次のコードは、この中間状態を表します。
trace(3 > (false));
「より大きい」演算子は、値 false を数値 0 に変換し、この数値を別のオペランド 3 と比較して、値 true を返します(つまり、値 3 は 0 より大きい)。
trace(3 > 0); // true
次の表は、ActionScript 3.0 の演算子を優先順位の高いものから順に示します。 同じ行に示されている演算子は優先順位が同じです。 各行に示されている演算子はその下に表示される行の演算子より優先順位が高くなります。
グループ
|
演算子
|
基本
|
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..
|
後置
|
x++ x--
|
単項
|
++x --x + - ~ ! delete typeof void
|
乗法
|
* / %
|
加減
|
+ -
|
ビット単位シフト
|
<< >> >>>
|
関係
|
< > <= >= as in instanceof is
|
等価
|
== != === !==
|
ビット単位の論理積(AND)
|
&
|
ビット単位の排他的論理和(XOR)
|
^
|
ビット単位の論理和(OR)
|
|
|
論理積(AND)
|
&&
|
論理和(OR)
|
||
|
条件
|
?:
|
代入
|
= *= /= %= += -= <<= >>= >>>= &= ^= |=
|
カンマ
|
,
|