2.5 算術演算子と式

(1/1)
加算
JavaScriptには算術演算子として、四則演算(加算、減算、乗算、除算)に加えて、剰余算、べき乗算がある。また、算術演算子を組み合わせた代入演算子がある。

目次

サンプル・プログラム

算術演算子と式

これまで見てきたように、JavaScriptには四則演算を含む算術演算子が備わっている。
ここで、たとえば [1 + 2] という加算式の場合、1と2をオペランド(operannd)、+を演算子(operator)と呼ぶ。そして、オペランドと演算子の組み合わせを式(expression)と呼ぶ。オペランドを2つ必要とする演算子を 2項演算子、1つだけのものを単項演算子と呼ぶ。
2項算術演算子
演算子意味
+加算
-減算
*乗算
/除算
%剰余算(余り)
**べき乗算
a ** b は a の b乗を計算する
IE11ではサポートされていないので Math.pow() 関数で代用すること

  19: <script>
  20: //ページのロード時に実行
  21: window.onload = function() {
  22:     let a = 3, b = 2;
  23:     let c;
  24:     document.getElementById('ret1').innerHTML = 'a = ' + a.toString();
  25:     document.getElementById('ret2').innerHTML = 'b = ' + b.toString();
  26: 
  27:     //加算
  28:     c = a + b;
  29:     document.getElementById('ret3').innerHTML = 'a + b = ' + c.toString();
  30: 
  31:     //減算
  32:     c = a - b;
  33:     document.getElementById('ret4').innerHTML = 'a - b = ' + c.toString();
  34: 
  35:     //乗算
  36:     c = a * b;
  37:     document.getElementById('ret5').innerHTML = 'a * b = ' + c.toString();
  38: 
  39:     //除算
  40:     c = a / b;
  41:     document.getElementById('ret6').innerHTML = 'a / b = ' + c.toString();
  42: 
  43:     //剰余算
  44:     c = a % b;
  45:     document.getElementById('ret7').innerHTML = 'a % b = ' + c.toString();
  46: 
  47:     //べき乗演算
  48:     c = a ** b;
  49:     document.getElementById('ret8').innerHTML = 'a ** b = ' + c.toString();
  50: 
  51:     //ゼロ除算
  52:     c = a / 0;
  53:     document.getElementById('ret9').innerHTML = 'a / 0 = ' + c.toString();
  54: }
  55: </script>

除算で、割る数をゼロにした場合にはエラー Infinity(無限大)が発生する。

代入演算子

JavaScriptでイコール = は等号を表すのではなく、代入演算子という演算子の一種である。 \( op1 = op2 \) のようにして用い、オペランド \( op2 \) を \( op1 \) に代入する。たとえば \( x=1+2 \)なら、\( 1+2 \) の計算結果を変数 \( x \) に代入する。

算術演算子と組み合わせた代入演算子も存在する。
たとえば \( x += 2 \) は、変数 \( x \) に2を加算し、変数 \( x \) に代入するという意味になる。
代入演算子
演算子意味
=代入
+=加算代入
-=減算代入
*=乗算代入
/=除算代入
%=剰余算代入
**=べき乗算代入
IE11ではサポートされていないので Math.pow() 関数で代用すること

  19: <script>
  20: //ページのロード時に実行
  21: window.onload = function() {
  22:     let a = 3, b = 2;
  23:     document.getElementById('ret1').innerHTML = 'a = ' + a.toString();
  24:     document.getElementById('ret2').innerHTML = 'b = ' + b.toString();
  25: 
  26:     //加算代入
  27:     b +a;
  28:     document.getElementById('ret3').innerHTML = 'b += a, b = ' + b.toString();
  29: 
  30:     //減算代入
  31:     b -a;
  32:     document.getElementById('ret4').innerHTML = 'b -= a, b = ' + b.toString();
  33: 
  34:     //乗算代入
  35:     b *a;
  36:     document.getElementById('ret5').innerHTML = 'b *= a, b = ' + b.toString();
  37: 
  38:     //除算代入
  39:     b /= a;
  40:     document.getElementById('ret6').innerHTML = 'b /= a, b = ' + b.toString();
  41: 
  42:     //剰余算代入
  43:     b %a;
  44:     document.getElementById('ret7').innerHTML = 'b %= a, b = ' + b.toString();
  45: 
  46:     //べき乗算代入
  47:     b **a;
  48:     document.getElementById('ret8').innerHTML = 'b **= a, b = ' + b.toString();
  49: }
  50: </script>

  20: <script>
  21: //ページのロード時に実行
  22: window.onload = function() {
  23:     let a = 3, b = 2;
  24:     let c, d, e;
  25:     document.getElementById('ret1').innerHTML = 'a = ' + a.toString();
  26:     document.getElementById('ret2').innerHTML = 'b = ' + b.toString();
  27: 
  28:     //加算して代入
  29:     c = a + b;
  30:     document.getElementById('ret3').innerHTML = 'c = a + b = ' + c.toString();
  31: 
  32:     //代入結果を代入(1)
  33:     d = c = a + b;
  34:     document.getElementById('ret4').innerHTML = 'c = a + b = ' + c.toString();
  35:     document.getElementById('ret5').innerHTML = 'd = c = a + b = ' + d.toString();
  36: 
  37:     //代入結果を代入(2)
  38:     e = (c = a + b* 2;
  39:     document.getElementById('ret6').innerHTML = 'c = a + b = ' + c.toString();
  40:     document.getElementById('ret7').innerHTML = 'e = (c = a + b) * 2 = ' + e.toString();
  41: }
  42: </script>

結合性

結合性
a + b の評価結果は 5 である。代入演算子 c = a + b は、式の評価結果を左辺の変数cに代入するという意味でもある。

では、代入演算子の評価結果は何だろうか。これは、左辺の値そのものである。
ということは、式 d = c = a + b は、cの値をdに代入する意味であるから、変数cとdには同じ値が入ることになる。これを、代入演算子の結合性は右から左という。

さらに、d = (c = a + b) * 5 では、まず、c = a + b の結果に5を乗算する。乗算の結合性は左から右だ。その乗算の結果を、代入演算子により変数dに代入する。
演算子と結合性
演算子意味結合性
+加算左から右
-減算
*乗算
/除算
%剰余算(余り)
**べき乗算
=代入右から左
+=加算代入
-=減算代入
*=乗算代入
/=除算代入
%=剰余算代入
**=べき乗算代入

文字列演算子

JavaScriptでは文字列型のオペランドに対してプラス + を用いると、加算ではなく、文字列の結合を意味する。
たとえば s = 'abc' + 'def' では変数sに 'abcdef' が代入される。
文字列演算子
演算子意味
+結合

コラム:代入演算子

Intel 8080
Intel 8080
なぜ a = a + b と同じ作用をする代入演算子 a += b が存在するかというと、これにはCPUを直接プログラミングできる機械語の影響がある。
1974年(昭和49年)4月に発表されたインテルの8ビットCPU 8080は、その後、ザイログ社が機能強化した Z80 として、多くの国産パソコンに搭載された。
8080の加算命令は ADD r という単項演算子で、アキュムレータAとオペランドの加算結果をAに代入するというものだった。つまり代入演算子 a += b が、これに相当する。
アキュムレータというのは、CPUの中で演算を行うことができるレジスタ(変数のようなもの)である。8080 のアキュミュレータはAレジスタの1つしかなかった。

8080 には、他に汎用レジスタB, Cがある。これらを用いて a = b + c を実現するには
LD A,B
ADD C
の2命令となる。
機械語として2項演算子を実装してしまうと、組み合わせパターンが増えてしまい、それは回路が複雑になることを意味する。だから単項演算子しか実装されなかった。
(この項おわり)
header