第4回 式と演算TypeScriptで学ぶJavaScript入門(2/3 ページ)

» 2014年08月05日 17時24分 公開
[羽山博,]

演算子の結合方向にも注意

 表の中にある「結合方向」とは同じ優先順位の演算が実行される順序のことである。例えば、代入演算子の「=」や「+=」は「←(右から左)」となっているので、右から左に向かって演算が実行される。例えば以下のような例であれば、bに2が加算された後、変数aに変数bの値(つまり12)が代入される。従って、変数aの値も変数bの値も12になる。

var a, b: number;
b = 10;
a = b += 2;     // 「b += 2」が実行された後、「a = b」が実行される
alert("aの値は" + a + "\nbの値は" + b);


 もし、代入演算子の結合方向が「→(左から右)」だとすると、「a = b」が先に実行されるので、変数aの値が10になり、変数bの値が12になるはずだが、もちろんそうはならない。

 なお、説明の順序が逆になったが、「+=」は、変数の値に右辺の値を加算した値を変数に代入するための演算子である。以下のコードは同じ意味だが、「+=」を使った方が値を加算していることを簡潔に表現できる。

// 以下の2つは同じ意味
b = b + 2;
b += 2;

「=」演算子と「+=」演算子

 「-=」や「*=」、「/=」も同様に、右辺の値を減算したり、乗算したり、除算した値を変数に代入する演算子である。

 結合方向の話に戻ろう。代入演算子とは異なり、一方、算術演算子の「+」「-」「*」「/」などは「→(左から右)」の順に計算される。以下の例であれば、「b / c」が計算された後、その結果に3が掛けられる。従って、aの値は「30 / 2」の結果である15に3を掛けた45となる。

var a, b, c: number;
b = 30;
c = 2;
a = b / c * 3;
alert("aの値は" + a);


 もし、結合方向が「←(右から左)」だとすると、「c * 3」が先に実行されるので、変数bを6で割ることになり、結果が5になってしまうが、もちろんそうはならない。「c * 3」を先に実行したいなら、以下のように書けばよい。

a = b / (c * 3);

カッコによる演算の優先順位の指定

 インクリメント(加算。「++」)とデクリメント(減算。「--」)の演算子は、値を1増やしたり、減らしたりする演算子だが、これらには結合方向が示されていない。というのは、これらの演算子が同時に複数個使われることがないからである。

var count: number;
count = 0;
alert(++count);


 このプログラムを実行すると、変数countの値が1増やされた結果(つまり1)が表示される。さらに1増やすというつもりで「++++count」や「++(++count)」と書いてもエラーになってしまう。普通はそういう書き方をしようとは思わないだろうが、演算子の詳しい働きを確認するためにそういう実験をしてみるのもいい。

 なお、上のプログラムを実行すると「1」という結果が表示されるが、次のプログラムを実行すると「0」という結果が表示される。ただし、変数countの値は1になっている。

var count: number;
count = 0;
alert(count++);


 「++」を変数名の前に付けたときには、変数の値が増やされ、その増やされた値が返される。しかし、「++」を変数名の後に付けたときには、変数の値は増やされるが、返される値は増やされる前の値である。「--」の場合は値が減らされるが動きは同様である。この話については、後でもう一度触れるが、いったんまとめておくと以下のようになる。

  • 前置型……変数の値が増やされたあと、変数の値が返される
  • 後置型……変数の値は増やされるが、返される値は元の値

 念のため、alertメソッドをもう1つ追加して、変数countの値を表示してみよう。最初のalertでは0が表示され、次のalertでは1が表示されるはずだ。

[コラム]Google Chromeでは、連続して表示されるalertダイアログボックスを非表示にできる

 上のプログラムのように複数のalertメソッドが続く場合、Google Chromeでは、2つ目以降のalertメソッドで表示されるダイアログボックスに「このページでこれ以上ダイアログボックスを生成しない」というチェックボックスが表示されます。次々と表示されるメッセージをいちいち確認するのが面倒なときにはチェックマークをオンにしておくといいでしょう。ただし、プログラムの実行が途中で終了するわけではありません。ダイアログボックスが表示されないだけで、それ以降の処理は実行されます。


 蛇足だが、符号を表す「+」や「-」には結合方向があり「←(右から左)」の方向に演算が実行される。例えば、以下のように書くと、結果は10となる(マイナスのマイナスなのでプラスになる)。ただし、2つの「-」の間にスペースを入れずに「--」と書くと、デクリメントの演算子になることに注意しよう。

 もう1つ、特殊な例も示しておこう。カンマ演算子は単に変数やリテラルを区切って並べるだけの働きしか持たないように見えるが、式は評価され、後ろの値が返される。結合の方向は「→(左から右)」なので、最後にある式の値が返される。では、以下のプログラムを実行すると、どうなるか考えてみよう。

var a:number = 10, b:number = 20;
var c;
c = (a + 1, b, 30);      // (1)
alert(c);


 (1)に注目しよう。最初に「a + 1」という演算が実行され、11という値が求められる。次にカンマ演算子によって、後ろの変数bの値(20)が求められる。さらに、またカンマ演算子によって、後ろの30というリテラルの値が求められる。従って、変数cにかっこ表示される結果は30となる。

 では、(1)の式に()を付けなければどうなるだろう。こちらについても考えてみてほしい。演算子の優先順位は「,」よりも「=」の方が高いので、「c = a + 1」が実行された後、bという変数が式として評価され、30というリテラルが式として評価される。しかし、変数cの値は11なので、結果は「11」と表示される。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。