演算子

演算子とは、1 つまたは複数のオペランドを取り、1 つの値を返す特殊な関数です。 オペランドとは、演算子が入力として使用する値で、通常はリテラル、変数、または式を取ります。例えば、次のコードでは、加算(+)および乗算(*)演算子をリテラルオペランド(2、3および 4と共に使用して、値を返します。この値は、続いて代入(=)演算子によって使用され、戻り値 14 を変数 sumNumber に代入します。

var sumNumber:uint = 2 + 3 * 4; // uint = 14

演算子には、単項、二項、および三項があります。 単項演算子は、オペランドを 1 つだけ取ります。例えば、インクリメント(++)演算子は、オペランドを 1 つだけ取るため、単項演算子です。二項演算子は、オペランドを 2 つ取ります。例えば、除算(/)演算子はオペランドを 2 つ取ります。三項演算子はオペランドを 3 つ取ります。例えば、条件(?:)演算子は 3 つのオペランドを取ります。

一部の演算子はオーバーロードされます。つまり、渡されたオペランドの種類または数に応じて動作が異なります。加算(+)演算子は、オペランドのデータ型によって動作が異なるオーバーロード演算子の例です。オペランドが両方とも数値の場合、加算演算子は値の合計値を返します。 オペランドが両方ともストリングの場合、加算演算子は 2 つのオペランドの連結を返します。 次のコード例は、演算子の動作がオペランドによってどのように異なるかを示します。

trace(5 + 5); // 10 
trace("5" + "5"); // 55

演算子は、指定されたオペランドの数によっても動作が異なります。 除算(-)演算子は、単項および二項演算子です。オペランドが 1 つだけ指定されると、除算演算子はオペランドを否定し、その結果を返します。 オペランドが 2 つ指定されると、除算演算子は 2 つのオペランドの差を返します。 次の例では、最初に単項演算子、次に二項演算子として使用される除算演算子を示します。

trace(-3); // -3 
trace(7 - 2); // 5

演算子の優先順位と結合性

演算子の優先順位と結合性により、演算子を処理する順序が決まります。 算術プログラミングに慣れている開発者にとって、コンパイラーが乗算(*)演算子を加算(+)演算子より先に処理するのは自然なことですが、コンパイラーは、どの演算子を最初に処理するかについて明示的な指示を必要とします。このような指示を、総称して演算子の優先順位と呼びます。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)

||

条件

?:

代入

= *= /= %= += -= <<= >>= >>>= &= ^= |=

カンマ

,

基本演算子

基本演算子は、Array リテラルおよび Object リテラルの作成、式のグループ化、関数の呼び出し、クラスインスタンスのインスタンス化、およびプロパティへのアクセスに使用する演算子です。

次の表の基本演算子の優先順位はすべて同じです。 E4X 仕様に規定されている演算子には、(E4X) と表示されます。

演算子

実行される演算

[]

配列の初期化

{x:y}

オブジェクトの初期化

()

式のグループ化

f(x)

関数の呼び出し

new

コンストラクターの呼び出し

x.y x[y]

プロパティへのアクセス

<></>

XMLList オブジェクトの初期化(E4X)

@

属性へのアクセス(E4X)

::

名前の修飾(E4X)

..

子孫 XML エレメントへのアクセス(E4X)

後置演算子

後置演算子は、1 つの演算子を取り、演算子の値をインクリメントまたはデクリメントします。 これらの演算子は単項演算子ですが、優先順位が高いことと、その特別なビヘイビアーにより、他の単項演算子からは区別して分類されます。 後置演算子をより大きい式の一部として使用する場合、後置演算子が処理される前に、式の値が返されます。例えば、次のコードは、値がインクリメントされる前に、式の値 xNum++ が返される方法を示します。

var xNum:Number = 0; 
trace(xNum++); // 0 
trace(xNum); // 1

次の表の後置演算子の優先順位はすべて同じです。

演算子

実行される演算

++

インクリメント(後置方式)

--

デクリメント(後置方式)

単項演算子

単項演算子は 1 つのオペランドを取ります。 このグループのインクリメント(++)演算子とデクリメント(--)演算子は前置演算子であり、式ではオペランドの前に表示されます。前置演算子が後置演算子と異なるのは、インクリメント演算またはデクリメント演算が、式全体の値が返される前に完了することです。 例えば、次のコードは、値がインクリメントされてから、式の値 ++xNum が返される方法を示します。

var xNum:Number = 0; 
trace(++xNum); // 1 
trace(xNum); // 1

次の表の単項演算子の優先順位はすべて同じです。

演算子

実行される演算

++

インクリメント(前置方式)

--

デクリメント(前置方式)

+

単項プラス

-

単項マイナス

!

論理否定(NOT)

~

ビット単位の論理否定(NOT)

delete

プロパティの削除

typeof

タイプ情報を返す

void

未定義の値を返す

乗法演算子

乗法演算子は、2 つのオペランドを取り、乗算、除算、または剰余計算を実行します。

次の表の乗法演算子の優先順位はすべて同じです。

演算子

実行される演算

*

乗算

/

除算

%

剰余

加減演算子

加減演算子は 2 つのオペランドを取り、加算または減算を実行します。 次の表の加減演算子の優先順位はすべて同じです。

演算子

実行される演算

+

加算

-

減算

ビット単位シフト演算子

ビット単位シフト演算子は 2 つのオペランドを取り、2 番目のオペランドで指定された範囲で最初のオペランドのビットをシフトします。 次の表のビット単位シフト演算子の優先順位はすべて同じです。

演算子

実行される演算

<<

ビット単位の左シフト

>>

ビット単位の右シフト

>>>

ビット単位の符号なし右シフト

関係演算子

関係演算子は 2 つのオペランドを取り、値を比較してブール値を返します。 次の表の関係演算子の優先順位はすべて同じです。

演算子

実行される演算

<

より小さい

>

より大きい

<=

より小さいか等しい

>=

より大きいか等しい

as

データ型のチェック

in

オブジェクトプロパティのチェック

instanceof

プロトタイプチェーンのチェック

is

データ型のチェック

等価演算子

等価演算子は 2 つのオペランドを取り、値を比較してブール値を返します。 次の表の等価演算子の優先順位はすべて同じです。

演算子

実行される演算

==

等価

!=

不等価

===

厳密な等価

!==

厳密な不等価

ビット論理演算子

ビット論理演算子は 2 つのオペランドを取り、ビットレベルの論理演算を実行します。 ビット論理演算子の優先順位は異なりますが、高いものから順に次の表に示します。

演算子

実行される演算

&

ビット単位の論理積(AND)

^

ビット単位の排他的論理和(XOR)

|

ビット単位の論理和(OR)

論理演算子

論理演算子は 2 つのオペランドを取り、ブール値の結果を返します。 論理演算子の優先順位は異なりますが、高いものから順に次の表に示します。

演算子

実行される演算

&&

論理積(AND)

||

論理和(OR)

条件演算子

条件演算子は三項演算子であり、3 つのオペランドを取ります。 条件演算子は、if..else 条件ステートメントを適用する簡易的な方法です。

演算子

実行される演算

?:

条件

代入演算子

代入演算子は 2 つのオペランドを取り、他のオペランドの値に基づいて 1 つのオペランドに値を割り当てます。 次の表の代入演算子の優先順位はすべて同じです。

演算子

実行される演算

=

代入

*=

乗算後代入

/=

除算後代入

%=

剰余を代入

+=

加算後代入

-=

減算後代入

<<=

ビット単位での左シフト後代入

>>=

ビット単位での右シフト後代入

>>>=

ビット単位での符号なし右シフト後代入

&=

ビット単位の論理積(AND)を代入

^=

ビット単位の排他的論理和(XOR)を代入

|=

ビット単位の排他的論理和(OR)を代入