カンマ演算子は必ず右の値を返す [Edit]

カンマ(,)演算子は、あまり使われることがありません。使用するメリットがあるのは、forステートメントくらいで、かぎられたものでしょう。しかし、「ActionScriptリファレンスガイド」に、かなり基本的な間違いがあります。

カンマ(,)演算子を使うと、式を連続して書くことができます。

i=0, j=1;

しかし、セミコロン(;)を使えば、複数のステートメントを1行に記述することは可能です。

i=0; j=1;

ゼミコロン(;)との違いは、変数のvar宣言がひとつで済むことです。ただ、それでどれだけ手間が減るかは疑問でしょう。とくに型宣言が加わると、変数ごとにステートメントを分けた方が見やすいように思います。

var i:Number = 0, j:Number = 1;

使う必要性があるのは、forステートメントで、複数のカウンタ変数を設定する場合です。ここでは、セミコロン(;)を使用することができないからです。

for (var i:Number = 0, j:Number = 1; i<nMax; i++, j++) {}

テキスト的な解説は、このあたりにします。Flash MX 2004「ActionScriptリファレスンガイド」の,(カンマ)演算子の項を見ると、「例」にとんでもないことが書かれています。

「次の例では、カッコ()演算子なしでカンマ(,)演算子を使用しています。カッコ()演算子がない場合、カンマ演算子は最初の式の値だけを返していることが わかります。

var v:Number = 0;
v = 4, 5, 6;
trace(v); // 出力: 4」

つぎのように括弧()を加えれば、カンマ(,)演算子は演算対象のオペランド(被演算子)を左の4から順に評価して、一番右側のオペランドの値6を返します。

var v:Number;
v = (4, 5, 6);
trace(v); // 出力: 6

括弧()がないと、この動作の仕様が変わってしまうのでしょうか。そんなはずはありません。初めのスクリプトの例からもわかるとおり、カンマ(,)演算子より、代入演算子(=)の方が優先度は高いので、括弧()でその順序を明示的に変えないかぎり、代入式が先に評価されます。つまり、まず変数vに4が代入されます。

その後、カンマ(,)演算子は、オペランドを右に順に評価して、最後に一番右の値6を返します。しかし、上記のスクリプトには、その値6を受取る変数がありません。以下のようにtrace()ステートメントで試してみれば、問題なく6が出力されます。

var v:Number;
trace((v = 4, 5, 6)); // 出力: 6

つまり、括弧()がない場合の処理順序を明示すれば、つぎのようになるのです。

(v = 4), 5, 6

結局、カンマ(,)演算子は、括弧をつけようがつけまいが、必ず一番右側のオペランドの値を返します。

その他の記事