AI生成コンテンツ / AI-generated content
サンプル・プログラム
インクリメント演算子
ここでは 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).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 は後置の例で 6、前置の例で 5 となる。
前置にすると必ずループが1回減るわけではない。回数は初期値や条件式による。for (let i = 0; i < 5; i++) のように、更新部分で式の値を使わない場合は、++i に変えても回数は同じである。読み取りやすさを優先するなら、条件の比較と変数の更新を別々に書く方法もある。
デクリメント演算子
たとえば let i = 3; let a = i--; では a が 3、i が 2 になる。別に let i = 3; let a = --i; と実行すると、a と i はどちらも 2 になる。
| 演算子 | 名称 | 式の値 | 実行後のA |
|---|---|---|---|
| A++ | 後置インクリメント | 3 | 4 |
| ++A | 前置インクリメント | 4 | 4 |
| A-- | 後置デクリメント | 3 | 2 |
| --A | 前置デクリメント | 2 | 2 |
各行は、それぞれ A = 3 から別々に実行した場合である。
練習問題
コラム:ノイマン型コンピュータと万能チューリングマシン
「コラム:メインフレーム」で紹介した ENIAC は、当初、ケーブルの接続やスイッチの設定で計算手順を指定していた。現在の多くのコンピュータでは、命令を表すプログラムを記憶装置に置き、順に読み出して実行する。これをプログラム内蔵方式という。
命令とデータを同じ記憶装置に置く構成は、後にノイマン型コンピュータと呼ばれた。現代の多くのコンピュータの基礎だが、命令用とデータ用の記憶装置を分ける構成などもあり、すべてが同じ構成というわけではない。
マス目に記号を書ける、必要なだけ延ばせるテープと、記号を読み書きして左右に移動するヘッドを考える。機械は有限個の状態を持ち、現在の状態と読んだ記号に応じた規則に従って、書く記号、移動方向、次の状態を決める。
万能チューリングマシンは、別のチューリングマシンの規則と入力を記号列として受け取り、その動作を再現できる機械である。同じ機械に異なる手順を与えて使う点は、プログラム内蔵型コンピュータにも通じる。ただし、理論上の計算モデルとハードウェアの構成は別の話であり、現実のコンピュータには記憶容量などの制限がある。
JavaScript の eval() は文字列をプログラムとして実行する関数である。しかし、万能チューリングマシンを再現するのに、この関数が必須というわけではない。状態やテープをデータとして表し、条件分岐と繰り返しで規則を処理することでも再現できる。
また、外部から受け取った文字列を不用意に eval() に渡すと、意図しないコードを実行する危険がある。通常のプログラミングでは、目的に合った安全な方法を選ぼう。
参考サイト
- Update Expressions:ECMAScript言語仕様
- インクリメント(++):MDN Web Docs
- デクリメント(--):MDN Web Docs
- eval():MDN Web Docs
- Computers — Timeline of Computer History:Computer History Museum
- Eckert and Mauchly Sign a Contract to Build the EDVAC:Computer History Museum
- How a 70-year-old Baby changed the face of modern computing:マンチェスター大学
- On Computable Numbers, with an Application to the Entscheidungsproblem:A. M. Turing(1936年)

記号を変数の前に置く「前置」と、後ろに置く「後置」では、式の値として使われる数が異なる。変数に入る数と、式の値を区別して確かめよう。