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

(1/1)
カウンター・数取器のイラスト
JavaScriptには、ループ処理などのカウンタとしてよく使われるインクリメント演算子とデクリメント演算子がある。それぞれに後置と前置があり、評価の順序が違うので注意が必要だ。

目次

サンプル・プログラム

インクリメント演算子

1.4 繰り返し処理 - forループ]」で紹介したように、forループインクリメント演算子 ++ をよく使う。i++ の作用は i = i + 1 と同じである。
キー入力回数が減ることと、何かのカウンタに使っていることを明示する意味で、インクリメント演算子が使われる。

インクリメント演算子には、後置インクリメント i++ と前置インクリメント ++i の2種類がある。評価の順番に留意しておこう。

  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++ は、式 (i++).toString() が評価された後に加算する。このため、表示は 1 のままだ。
前置インクリメント ++i は、式 (++i).toString() が評価される前に加算する。直上の後置インクリメントで1加算された後、さらに1加算されるので、表示は 3 となる。

  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>

forループでは、後置インクリメントでも前置インクリメントでもループ回数には影響しないが、あとで解説する whileループでは、前置インクリメントの方がループ回数が1回減る。条件演算子を実行する前に加算するからだ。
ループ処理でインクリメント演算値を使うときは、後置にするか前置にするか注意が必要だ。

デクリメント演算子

1を減算するデクリメント演算子もある。インクリメント演算子同様、ループ処理でよく使われる。こちらも、後置デクリメント i-- と前置インクリメント i-- の2種類があり、評価の順番に留意しておこう。
インクリメント演算子とデクリメント演算子
演算子意味
A++後置インクリメント演算子
++A前置インクリント演算子
A--後置デクリメント演算子
--A前置デクリメント演算子

練習問題

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

ジョン・フォン・ノイマン
ジョン・フォン・ノイマン
コラム:メインフレーム」で紹介した ENIAC は、プログラムを内蔵していなかった。どういうことかというと、計算の仕組みをすべて電子回路(ハードウェア)で実装しており、計算式を変えるには回路を組み替えなければならなかった。
この問題に気付いたアメリカの数学者フォン・ノイマンは、プログラムとデータを区別せずに記憶装置に記憶でき、演算装置はアドレスを使って記憶装置の任意の場所にアクセスできるアーキテクチャを提案し、これが後にノイマン型コンピュータと呼ばれ、メインフレームから現代のパソコン、スマホ、IoT機器に至るまで、すべてのコンピュータの基本アーキテクチャとなった。
Manchester Small-Scale Experimental Machine(SSEM)
Manchester Small-Scale Experimental Machine(SSEM)
しかし、ENIAC を改良し、プログラム内蔵型として設計し直した EDVAC (エドバック)  の開発は遅れ、世界最初のノイマン型コンピュータは1948年(昭和23年)6月に稼動したイギリスの Manchester Small-Scale Experimental Machine ということになった。
ノイマン型コンピュータは、1936年(昭和11年)にアラン・チューリングが提唱した万能チューリングマシンの1つの解である。
マス目に分かれた任意の長さのテープと、そのテープの上を1マスずつ前後に移動でき、現在位置のマス目の記号を読み取ったり書き込んだりできるヘッドで構成される簡単な機械をチューリングマシンと呼ぶ。この機械に外部から、(1)有限個の記号の定義、(2)あらかじめ記号の列が書き込まれたテープ、(3)ヘッドの状態を遷移させる規則の集合を与えると、さまざまな計算ができる。ノイマン型コンピュータに置き換えると、(1)はハードウェア、(2)と(3)がソフトウェア(プログラム+データ)である。
万能チューリングマシンとは、任意の符号化されたチューリングマシンを受け取って、その動作を完全に真似ることができるものを指す。

JavaScript をはじめとするモダン・プログラミング言語では、プログラム(関数・メソッド)とデータ(変数・プロパティ)は分かれているように見える。しかし、後述する「インスタンス」でわかるように、メソッドと同じレベルでプロパティを扱うことができる。また、今日では脆弱性の1つとされる evalメソッドも、万能チューリングマシンという観点からみると必要なメソッドである。
(この項おわり)
header