2.8 インクリメント演算子、デクリメント演算子

(1/1)
手持ち数取り器で人数をカウントする陽奈
ボタンを押すたびに数が1増える数取り器(AI生成)
AI生成コンテンツ / AI-generated content
手持ち数取り器は、ボタンを押すたびに数が1増える。JavaScriptでも、変数の値を1増やす ++(インクリメント演算子)と、1減らす --(デクリメント演算子)を使える。
記号を変数の前に置く「前置」と、後ろに置く「後置」では、式の値として使われる数が異なる。変数に入る数と、式の値を区別して確かめよう。

目次

サンプル・プログラム

インクリメント演算子

「1.4 繰り返し処理 - forループ」で紹介したように、回数を数える変数の更新には i++ をよく使う。
ここでは i に小さな整数が入っているものとする。変数を1増やす働きは i = i + 1 と同じだが、式全体の値まで同じとは限らない。また、文字列の場合は挙動が違い、たとえば i が文字列の "1" なら、i++ は数値の 2 に更新するが、i = i + 1 は文字列の "11" を代入する。

後置インクリメント i++ も前置インクリメント ++i も、変数 i を1増やす。違いは、後置が更新前の値を、前置が更新後の値を式の値にする点である。単独の文として使う場合は、どちらも変数を1増やすだけである。

increment1.html

  19: <script>
  20: //ページのロード時に実行
  21: window.onload = function() {
  22:     let i = 1;
  23:     document.getElementById('ret1').innerHTML = 'i = ' + i.toString();
  24:     document.getElementById('ret2').innerHTML = 'i = ' + (i++).toString();
  25:     document.getElementById('ret3').innerHTML = 'i = ' + (++i).toString();
  26: }
  27: </script>

最初の表示は i = 1 である。次の (i++).toString() では、i++ が変数を 2 に更新し、更新前の 1 を式の値にする。その 1 を文字列にするため、表示は i = 1 となる。
続く (++i).toString() では、変数を 2 から 3 に更新し、式の値も 3 となるため、表示は i = 3 となる。後置でも、文字列への変換や表示より前に変数は更新されている。

increment2.html

  19: <script>
  20: //ページのロード時に実行
  21: window.onload = function() {
  22:     //後置インクリメントでwhileループ
  23:     let i = 1;
  24:     while (i++ < 5) {
  25:         document.getElementById('ret1' + i.toString()).innerHTML = 'i = ' + i.toString();
  26:     }
  27: 
  28:     //前置インクリメントでwhileループ
  29:     i = 1;
  30:     while (++i < 5) {
  31:         document.getElementById('ret2' + i.toString()).innerHTML = 'i = ' + i.toString();
  32:     }
  33: }
  34: </script>

この例では i を 1 から始める。後置の while (i++ < 5) は更新前の値を 5 と比べ、ループ本体では更新後の値を使うため、2・3・4・5 を表示する。前置の while (++i < 5) は更新後の値を比べるため、2・3・4 を表示する。
条件が偽になって終了するときにもインクリメントは実行される。終了後の i は後置の例で 6、前置の例で 5 となる。
前置にすると必ずループが1回減るわけではない。回数は初期値や条件式による。for (let i = 0; i < 5; i++) のように、更新部分で式の値を使わない場合は、++i に変えても回数は同じである。読み取りやすさを優先するなら、条件の比較と変数の更新を別々に書く方法もある。

デクリメント演算子

デクリメント演算子 -- は、変数の値を1減らす。後置デクリメント i-- は更新前の値を、前置デクリメント --i は更新後の値を式の値にする。
たとえば let i = 3; let a = i--; では a が 3、i が 2 になる。別に let i = 3; let a = --i; と実行すると、a と i はどちらも 2 になる。
インクリメント演算子とデクリメント演算子
演算子名称式の値実行後のA
A++後置インクリメント34
++A前置インクリメント44
A--後置デクリメント32
--A前置デクリメント22

各行は、それぞれ A = 3 から別々に実行した場合である。

練習問題

コラム:ノイマン型コンピュータと万能チューリングマシン

ジョン・フォン・ノイマン
ジョン・フォン・ノイマン
演算子を実行するコンピュータは、計算の手順をどのように記憶するのだろうか。
「コラム:メインフレーム」で紹介した ENIAC は、当初、ケーブルの接続やスイッチの設定で計算手順を指定していた。現在の多くのコンピュータでは、命令を表すプログラムを記憶装置に置き、順に読み出して実行する。これをプログラム内蔵方式という。
エッカートやモークリーらが進めた EDVAC の設計に参加したフォン・ノイマンは、1945年(昭和20年)の報告書草稿にプログラム内蔵型コンピュータの構成をまとめた。ノイマン一人の発明として説明するのは正確ではない。
命令とデータを同じ記憶装置に置く構成は、後にノイマン型コンピュータと呼ばれた。現代の多くのコンピュータの基礎だが、命令用とデータ用の記憶装置を分ける構成などもあり、すべてが同じ構成というわけではない。
Manchester Small-Scale Experimental Machine(SSEM)
Manchester Small-Scale Experimental Machine(SSEM)
EDVAC の完成に先立ち、イギリスのマンチェスター大学で、1948年(昭和23年)6月21日に Manchester Small-Scale Experimental Machine(SSEM、愛称 Baby)が最初のプログラムを実行した。電子的な読み書き可能メモリに保存したプログラムを動かした、世界初の電子式デジタルコンピュータである。
1936年(昭和11年)にアラン・チューリングが発表した論文は、「手順に従う計算」を理論上の機械で表した。これがチューリングマシンである。
マス目に記号を書ける、必要なだけ延ばせるテープと、記号を読み書きして左右に移動するヘッドを考える。機械は有限個の状態を持ち、現在の状態と読んだ記号に応じた規則に従って、書く記号、移動方向、次の状態を決める。
万能チューリングマシンは、別のチューリングマシンの規則と入力を記号列として受け取り、その動作を再現できる機械である。同じ機械に異なる手順を与えて使う点は、プログラム内蔵型コンピュータにも通じる。ただし、理論上の計算モデルとハードウェアの構成は別の話であり、現実のコンピュータには記憶容量などの制限がある。

JavaScript の eval() は文字列をプログラムとして実行する関数である。しかし、万能チューリングマシンを再現するのに、この関数が必須というわけではない。状態やテープをデータとして表し、条件分岐と繰り返しで規則を処理することでも再現できる。
また、外部から受け取った文字列を不用意に eval() に渡すと、意図しないコードを実行する危険がある。通常のプログラミングでは、目的に合った安全な方法を選ぼう。

参考サイト

(この項おわり)
header