変数と代入のトレース

読めることと、追えることは違います

前回で擬似言語の記法はひととおり見ました。ただ、記号の意味が分かることと、そのコードが結局何をするのかを言い当てられることは別の力です。科目 B で問われるのは後者です。そして後者は、頭の中だけで考えると必ずどこかで崩れます。人間の短期記憶は、変数 3 つ分を 10 行にわたって覚えていられるようにはできていません。

そこで使う道具がトレースです。1 行ずつ順番に実行したつもりになって、その行を実行し終えた時点の変数の値を書き出していきます。書き出す先がトレース表です。このコースはここから先、ずっとこの道具を使います。

代入は「右を計算して、左に入れる」

トレースで最初につまずくのが代入です。矢印 ← は等号ではありません。次の 2 行を見てください。

x ← 4 x ← x + 6

2 行目を「x と x + 6 が等しい」と読むと意味が通りません。正しくは「今の x である 4 に 6 を足して 10 を作り、それを新しい x にする」です。右側は必ずその行を実行する前の値で計算し、計算がすべて終わってから左側が書き換わります。この順番を守るだけで、代入だけのコードは間違えなくなります。

表の埋め方

表は、縦に行番号、横に変数を並べます。1 行実行したら、その行で変わった変数には新しい値を書き、変わらなかった変数には前の行と同じ値をそのまま書き写します。空欄にしないのが大切です。空欄があると、あとから見返したときに「まだ値が入っていないのか、書き忘れたのか」が区別できなくなります。まだ一度も代入されていない変数には、ダッシュのような記号で「値なし」と書いておきます。

つまずきやすいところ

始めたばかりの人がよくやるのは、数行まとめて頭の中で処理して結果だけ書くことです。速そうに見えますが、間違えたときにどこで狂ったのかが分からず、結局最初からやり直しになります。1 行につき 1 行、必ず書きます。慣れれば 1 行あたり数秒で処理できるようになり、まとめて考えるより結果として速く、しかも正確になります。

もう 1 つは、行を飛ばすことです。endif のように値が変わらない行は省きたくなりますが、省くと今どこを実行しているのかを見失います。値が変わらない行こそ、前の値を書き写して通過した印にします。

3 つ目は、速く書こうとして数字を雑に書くことです。トレース表は自分にしか読まれない紙ですが、その自分が数分後に読み違えます。6 と 0、1 と 7 のような取り違えは、実際の試験でよく起きます。少し大きめに、間隔をあけて書いてください。

やってみます

下の演習は、変数 2 つの値を入れ替えるコードです。入れ替えたいだけなのに 3 行も使っているのが引っかかりどころで、なぜ 3 行必要になるのかは、代入が「右を計算して左に入れる」動きだからです。1 行ずつ、その行を実行したあとの値を予測して入れてください。

課題

  1. 各行を実行したあとの値を入れる
  2. 値が変わらない変数はそのままの値を入れる
  3. まだ値が入っていない変数はダッシュのままにする

ヒント

1 / 6 行目のトレース

1○整数型: irekae()
2 整数型: a, b
3 a ← 5
4 b ← 3
5 a ← a + b
6 b ← a - b
7 a ← a - b
8 return a
実行した行ab
実行前
3 行目

3 行目を実行したあとの値を入れてください。変わらない変数は、 そのままの値を入れます。まだ値が入っていない変数は「」と入れます。