« 名前の付け方(識別子) | メイン | 演算子の優先順位と結合性 »

演算子

ある値に対して演算を行い、新しい値を作る記号を演算子といいます。簡単なものでは加算の記号の+があります。演算子には次のようなものがあります。

note:
演算の対象となる値や変数のことをオペランド(operand)と呼びます。1+2ならば1と2がオペランドです。演算子はオペレータ(operator)です。

■算術演算子
算術演算子は数値の演算を行います。+-*/は一般的な加減乗除の計算と同じです。/の除算では、0での割り算を行ってもエラーにはならず値はInfinity(正の無限大)または-Infinity(負の無限大)になります。なお、+と-は数値の前に付けて正負を示す符号としても機能します。

算術演算子
+ 加算(足し算)
- 減算(引き算)
* 乗算(掛け算)
/ 除算(割り算)
% 剰余(割り算の余り)

例:
a = 1 + 2; // aに3が入ります。
b = 10 - 2 - 1; // bに7が入ります。
c = 4 * 3; // cに12が入ります。
d = 12 / 4; // dに3が入ります。
e = 15 % 6; //15割る6の結果は2余り3なので、eには3が入ります。

■ストリング演算子
+は加算の演算子ですが、オペランドの一方がストリング(String、文字列)のとき、ストリングの連結(文をつなげる)を行う演算子になります。

ストリング演算子
+ ストリングの結合
add ストリングの結合(使用を避ける演算子)


例:
name = "鈴木";
age = 25;
msg1 = name + "さん" // msg1に"鈴木さん"が入ります。
msg2 = "わたしは" + age + "です"; //msg2に"わたしは25です"が入ります。


■代入演算子
代入演算子は変数に値を入力したり、プロパティに値を設定する場合に使います。演算結果を代入するものを複合演算子と呼ぶこともあります。


代入演算子
= 代入・設定
+= 加算後代入
-= 減算後代入
*= 乗算後代入
/= 除算後代入
%= 剰余を代入
++ インクリメント(1足す)
-- デクリメント(1引く)

算数の計算式の「1 + 2 = 3」の=は等号ですが、ActionScriptの=は「ans = 1 + 2」のように式を書いて、=の右項の値を左項の変数やプロパティに代入あるいは設定します。ActionScriptの等号は==または===です。
また、「a = 1 * 2 + 3」のように演算子を結合して式を作れるのと同様に=も連結できます。このとき、式が右側から実行されていく点に注意してください(演算子の結合性→p.??)

例:
a = 10; // aに10を代入
b = c = 10 + 1; // bとcに11を代入

例:
d = 3;
e = 2;
x = y = (z = d + e) * 2;
trace(x); //出力→ 10
trace(y); //出力→ 10
trace(z); //出力→ 5

複合演算子は演算と代入を組み合わせたものです。値が代入される変数は先に初期化されている必要があります。

例:
// aに3足す
a = 10;
a += 3;
//a = a + 3と同じ


例:
// bから8を引く
b = 15
b -= 4 * 2; // 15- 8で7になる
//b = b - 4 * 2と同じ

例:
// cに7を掛ける
c = 3;
c *= 7;
//c = c * 7と同じ

例:
// dを3で割る
d = 15
d /= 2 + 1;
//d = d /(2+1)と同じ


// eを11で割った余りをeに入れる
e %= 11;
//e = e % 11と同じ


++と--はオペランドに1を加算または減算する演算子ですが、演算子をオペランドの前に置くか後ろに置くかで演算と代入の順が違います。++aのようにオペランドの前に演算子を置いたものをプリインクリメントと呼び、先に変数aに1を加算してから残りのステートメントを実行します。一方、a++ようにオペランドの後ろに演算子を置いたものをポストインクリメントと呼び、ステートメントを実行した後から変数aに1を加算します。--a、a--も同様でそれぞれプリディクレメント、ポストデクリメントと呼びます。

例:
//aに1を加算した後でステートメントを実行する
a = 5;
x = ++a + 3;
trace(x); // xは9になります。aは既に6になっています。
trace(a); // aは6になります。aには1加算されています。

例:
//ステートメントを実行した後でaに1を加算する
a = 5;
x = a++ + 3;
trace(x); // xは8になります。aは5のままで計算されています。
trace(a); // aは6になります。aには1加算されています。

例:
//aから1を減算した後でステートメントを実行する
a = 5;
x = --a + 3;
trace(x); // xは7になります。aは既に4になっています。
trace(a); // aは4になります。aから1減算されています。

例:
//ステートメントを実行した後でaから1を減算する
a = 5;
x = a-- + 3;
trace(x); // xは8になります。aは5のままで計算されています。
trace(a); // aは4になります。aから1減算されています。


■比較演算子
比較演算子は、左右のオペランドの大きさまたは同じものかどうかを比較します。結果は、条件を満たすときにtrue、満たさない場合にはfalseの論理値になります。比較演算子は、if、while、forといった条件によって制御を判断するステートメントで主に利用します。

note:
trueおよびfalseを論理値と呼びます。trueの否定はfalse、falseの否定はtrueです。

比較演算子
a == b 等価(aとbが等しいときにtrue、等しくないときfalse)
a != b 不等価(aとbが等しくないときtrue、等しいときfalse)
a < b より小さい(aがbより小さいときtrue、そうでないときfalse)
a <= b 以下(aがb以下のときtrue、そうでないときfalse)
a > b より大きい(aがbより大きいときtrue、そうでないときfalse)
a >= b 以上(aがb以上のときtrue、そうでないときfalse)
a === b 厳密な等価(aとbが値もデータ型も等しいときにtrue、そうでないときfalse)
a !== b 厳密な不等価(aとbが値もデータ型も等しくないときにtrue、そうでないときfalse)

==と!=の等価であるかどうかの判断はデータ型に応じて比較されます。このとき、数値と論理値を比較した場合は、trueは1、falseは0として比較します。つまり(true==1)と(false==0)はtrueになります。一方、===と!==の厳密な等価の判断では、数値と論理値は別物とみなし、(true==1)と(false==0)はfalseになります。nullとundefineの比較でも同様です。(null==undefine)はtrueですが、(null===undefine)はfalseです。

例:
//my_mcのx座標がマイナスならばmy_mcの位置をx座標300へ動かす
if (my_mc._x < 0) {
 my_mc._x = 300;
}


次のものは使用を避ける演算子に分類されているものです。

使用を避ける演算子
<> 不等価
eq 等価
ne 不等価
lt より小さい
le 以下
gt より大きい
ge 以上

■論理演算子
論理演算子は、trueまたはfalseの論理値をオペランドとして扱う演算子です。(論理値→p.??)

論理演算子
a || b 論理和 (a、bどちらか一方でもtrueならばtrue。両方ともにfalseのときfalse)
a && b 論理積 (a、bともtrueのときtrue。そうでなければfalse)
!a 否定 (aがtrueならばfalse。aがfalseならばtrue)

例:
// 変数xの値が0以下または300以上のときにdの値に-1を掛ける
if ((x <= 0) || (x >= 300)) {
 d *= -1;
}

例:
//my_mcをクリックするたびにmy_txtフィールドの表示・非表示が入れ替わります
my_mc.onPress = function() {
 var v = my_txt._visible;
 my_txt._visible = !v;
};

sampleファイル→ronri_hitei.fla


次のものは使用を避ける演算子に分類されているものです。

使用を避ける演算子
or 論理和
and 論理積
not 論理否定(単項演算子)

■ビット演算子
ビット演算子とは、値を2進数に換算して計算を行うものです。各桁(ビット)ごとに値を比較したり、桁をシフトする演算を行います。

ビット演算子
| ビット単位の論理和 (OR)
& ビット単位の論理積 (AND)
~ ビット単位の否定 (NOT)
^ ビット単位の排他的論理和 (XOR)
<< ビット単位の左シフト
>> ビット単位の右シフト
>>> ビット単位の符号なし右シフト
|= ビット単位の排他的論理和 (OR) を代入
&= ビット単位の論理積 (AND) を代入
^= ビット単位の排他的論理和 (XOR) を代入
<<= ビット単位での左シフト後代入
>>= ビット単位に右シフト後代入
>>>= ビット単位に符号なし右シフト後代入

ビット単位の論理和では値を2進数に換算して各ビットごとに比較し、どちらかが1ならば1にします。たとえば、6(2進数で110)と5(2進数で101)のビット単位の論理和は7(111)になります。同様にビット単位の論理積では両方が1のときに1にし一方が0ならば0にします。6と5のビット単位の論理積は4(100)になります。
2進数における桁のシフトは左へ1シフトすると2倍(2×1階乗)、左へ2シフトすると4倍(2×2階乗)になり、逆に右へ1シフトすると1/2倍(2×-1階乗)、右へ2シフトすると1/4倍(2×-2階乗)になるというように値が2のn階乗で変化します。


例:
a = 6 | 5;
trace(a); //出力→ 7

b = 6 & 5;
trace(b); //出力→ 4

c = ~2
trace(c) //出力→ -3

d = 4 << 2;
trace(d); //出力→ 16

■記号演算子
スクリプトでは次に示す記号を利用します。+-は算術演算子ですが、符号にも利用します。

記号演算子
+ プラス符号(単項演算子)
- マイナス符号(単項演算子)
() グループ化演算、関数のパラメータを囲む
, ステートメントの区切り
. ドット演算子(メソッド、プロパティ、変数、クラスパス、メンバーへのアクセス)
: タイプの指定
[] 配列演算子、配列アクセス(プロパティ、変数、リニアリストへのアクセス)
{} 配列オブジェクト(連想配列、プロパティリストへのアクセス)
// コメント行区切り記号
/* コメントブロック区切り記号(開始)
*/ コメントブロック区切り記号(終了)

カンマを使えば、同一行に複数のステートメントを区切って書くことができます。通常、カンマはforループステートメントの中で利用しますが、次のように使うこともできます。(forループステートメント → p.??)

例:
a = 1, b = +a;
trace(a), trace(b);

これをセミコロンを使って書くと次のようになります。どちらも同じ結果になります。

例:
a = 1; b = +a;
trace(a); trace(b);

■その他の演算子
その他の演算子として、次のようなものがあります。

その他の演算子
?:  条件演算子(三項演算)
typeof  値のデータ型を調べる(単項演算子)
instanceof インスタンスが指定のクラスかどうかチェックする
void  値を破棄しundefinedを返す(単項演算子)
new  クラスからインスタンスを生成する
delete  変数、インスタンス、プロパティを消去する


?:は「条件式 ? 値1 : 値2;」の3つのオペランドをもった演算子です。条件式がtrueならば値1、条件式がfalseならば値2を返します。

例:
//変数aの値が60以上ならば"合格"、60未満ならば"不合格"とrに代入する
r = (a >= 60) ? "合格" : "不合格";

次のように条件に応じて処理を分岐させる目的でも利用できます。次のサンプルのmy_mcインスタンスをクリックするとcntの値が1からカウントアップされ、10を越えたならば再び1に戻ります。cntの値は出力パネルに書き出されます。

sampleファイル→sankou.fla

例:
//cntが10未満なら1加算し、10以上ならば1を代入する
my_mc.onPress = function() {
 (cnt < 10) ? (++cnt) : (cnt = 1);
 trace(cnt);
};


typeofはデータ型を返す演算子です。typeof(v)のように関数のような記述を目にしますが、実際にはtypeof vのようにカッコは不要です。(データ型 → p.??)

例:
v = "test";
trace(typeof v); //出力→ string

v = new Date();
trace(typeof v); //出力→ object

投稿者 oshige : 2005年2月12日 10:34