トラック3・🔍人間がコンピュータになる訓練

代入をトレースする

読む目安 約12分・ゴール:代入が「右辺を計算して左辺に上書きする」動作だと理解し、値の推移を正確に追える

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

まずは一番やさしい形、代入だけのプログラムをトレースします。ここを完璧にしておくと、あとがずいぶん楽になります。

代入は「上書き」である

C言語の = は、数学のイコールではありません。右側を計算して、左側の箱に入れるという命令です。読むときは右から左へ、と覚えてください。

int a = 3;
a = 5;

2行目のあと、a の値は5です。3はどこかに残っているのではなく、消えています。箱に入るものは常に1つだけ。これが変数の基本的な性質です。

自分自身を使う代入

初心者がつまずく形がこれです。

a = a + 1;

数学として読むと成り立たない式ですが、命令として読めば何も不思議はありません。

  1. まず右辺を計算する(今の a が3なら 3 + 1 で 4)
  2. その結果を左辺の a に入れる(a が4になる)

右辺の a は「古い値」、左辺の a は「新しい入れ物」です。この順番さえ守れば、絶対に間違えません。

ビット右を計算してから、左に入れる。この順番だけ覚えれば大丈夫だよ。

動かして確かめる

下のビジュアライザで、1ステップずつ進めてみてください。行が進むたびに、箱の中身が書き換わっていく様子が見えます。

🧪 メモリの図解:この図はアプリ内で1行ずつ動かせます。アプリでこのトピックを開く

進めながら、次の行を実行する前に自分の答えを口に出すのがおすすめです。当たれば理解できている、外れればそこが弱点です。ただ眺めるのと、予想してから確かめるのとでは、身につき方がまったく違います。

トレース表で書くとこうなる

int a = 3; のあとに a = a + 1; を実行した場合をトレース表にすると、変化が一目で分かります。

行 | a | 説明
---+---+--------------------------
 1 | 3 | aが作られ、3が入る
 2 | 4 | 右辺 3+1 を計算して代入

たった2行ですが、この「1行進むごとに1行書く」動作が全部の土台です。変数が5個に増えても、ループが100周しても、やることは同じです。

古典的な難問: 値の交換

2つの変数の中身を入れ替えたい、という場面を考えます。素直にこう書くと失敗します。

a = b;
b = a;

a が3、b が7のとき、1行目で a は7になります。すると2行目の右辺 a はもう7なので、b にも7が入ります。3が消えてしまいました。上書きは取り消せないからです。

正しくは、一時的な置き場をもう1つ用意します。

tmp = a;
a = b;
b = tmp;

これは、両手がふさがっている人が物を持ち替えるとき、いったん机に置くのと同じです。この形は今後あらゆる場面で出てくる定番なので、トレース表で必ず自分の手で確認しておいてください。ちなみに、なぜ失敗するのかを説明できるようになると、代入の理解は完成です。「上書きされた値は取り戻せない」——この一文がすべての理由になっています。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

変数 a に 5 が入っています。a = a + 1; を実行した直後の a の値はいくつでしょう。

  1. 5
  2. 1
  3. 数学的におかしいのでエラーになる
  4. 6
答えを見る

正解:D(6)

C言語の = は等号ではなく「右辺を計算して左辺に入れる」という命令です。まず右辺を今の値で計算し(5 + 1 = 6)、その結果を左辺のaに上書きします。右辺のaは古い値、左辺のaは新しい入れ物と読めば迷いません。数学の等式ではないので、エラーにもなりません。

確認問題 2

次のプログラムをトレースして、空欄を埋めましょう(まだ作られていない変数は「ー」と書いてあります)。

int a = 2;
int b = 5;
a = b;
b = 9;
行ab
12ー
225
3?5
45?
答えを見る

空欄の答え(上から順に):5、9

3行目の a = b; は「bの値(5)を計算して、aに上書きする」という命令なので、aは2から5に変わります。もとの2は消えてしまいます。4行目でbに9が入りますが、aは5のままです。代入は右から左、そして上書きされた値は戻せない、この2つが基本です。

「人間がコンピュータになる訓練」の目次

  1. トレース表とは——実行を目で見る道具
  2. 代入をトレースする
  3. 分岐をトレースする
  4. ループをトレースする
  5. バグを見つける思考法——仮説と検証
  6. ラバーダック・デバッグ
  7. エラーメッセージは敵ではない
  8. 総仕上げ——紙上プログラム実行

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版