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

分岐をトレースする

読む目安 約12分・ゴール:条件の真偽を判定し、通った道だけをトレース表に残せるようになる

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

このトピックの要点

次は道が2つに分かれる形、分岐のトレースです。ここでトレース表の書き方に1つ工夫を加えます。

条件の結果を列に足す

分岐があるプログラムでは、変数の値だけでなく「条件がどう判定されたか」を残します。列を1つ増やして、真(成り立った)か偽(成り立たなかった)かを書きましょう。

int 点 = 72;
if (点 >= 80) {
    合格 = 1;
} else {
    合格 = 0;
}

※ 実際のC言語では変数名に日本語は使いませんが、ここでは読みやすさを優先しています。

トレース表はこうなります。

行 | 点 | 合格 | 条件 | 出力
---+----+------+------+-----
 1 | 72 | ー  |      |
 2 | 72 | ー  | 偽   |
 5 | 72 | 0   |      |

3行目と4行目がないことに注目してください。条件が偽だったので、合格 = 1; の行は実行されていません。実行されていない行は、表に書きません。これがルール3です。

ビット表に残っている行が、実際に通った道そのものなんだ。地図に足跡をつけていく感じだね。

よくある間違い: 両方書いてしまう

初心者のトレース表を見ると、if と else の両方の行が書かれていることがあります。気持ちは分かります。目に入っているからです。

ですが機械は、片方しか実行しません。両方書いてしまうと、実際には起きない値の変化が表に残り、そのあとの行が全部ずれます。「見えているもの」ではなく「実行されたもの」だけを書く。この線引きが分岐トレースの肝です。

条件の判定を丁寧にやる

条件そのものも、あわてず1つずつ計算します。

まず変数を今の値に置き換えて、それから比べる。この2段階を口に出すと、勘違いが激減します。

通らなかった行が、いちばん怪しい

分岐のバグには特徴があります。通ってほしい行が通っていないという形で現れるのです。

どれも、表を見れば「条件の列がずっと偽」という形で目に見えます。プログラムが黙って何もしないときは、たいていここです。エラーが出ないぶん、かえって気づきにくい種類のバグでもあります。

多段の分岐

else if が連なる形では、上から順に判定して、最初に成り立ったものだけを実行し、残りは見もしないという性質があります。

if (点 >= 80) { 評価 = 'A'; }
else if (点 >= 60) { 評価 = 'B'; }
else { 評価 = 'C'; }

点が90のとき、1つ目が真なので 'A' が入り、2つ目の 点 >= 60 は判定すらされません。トレース表にも書きません。この「見もしない」感覚は、条件の順番を間違えたときのバグ(たとえば >= 60 を先に書いてしまう)を見抜く目になります。

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

確認問題

確認問題 1

if / else の分岐をトレース表に書くときの作法として、正しいものはどれでしょう。

  1. if側とelse側の両方の行を、念のため両方とも書く
  2. 条件の判定結果によって、実際に通った側の行だけを書く
  3. 条件が偽だったら、そこから先の行は一切書かない
  4. 分岐の中では変数の値が変わりやすいので、値は書かなくてよい
答えを見る

正解:B(条件の判定結果によって、実際に通った側の行だけを書く)

機械は片方しか実行しません。両方書くと、実際には起きていない値の変化が表に残り、その後の行がすべてずれてしまいます。また、条件が偽でもelse側や分岐の後の行は実行されるので、「そこから先を書かない」も誤りです。値は常に全部書き写します。

確認問題 2

分岐のあるプログラムです。トレースして空欄を埋めましょう(「行」の空欄には、実際に実行された行番号を書きます。条件の欄は「真」または「偽」)。

int x = 7;
int y = 0;
if (x > 10) {
    y = 1;
} else {
    y = 2;
}
y = y * 4;
行xy条件
17ー
270
370?
?72
87?
答えを見る

空欄の答え(上から順に):偽、6、8

3行目の条件は 7 > 10 なので偽です。したがって4行目(y = 1;)は実行されず、表にも書きません。実行されるのはelse側の6行目で、yに2が入ります。最後の8行目で y = 2 * 4 となり、答えは8です。分岐のトレースでは「見えている行」ではなく「実際に通った行」だけを書くのが鉄則です。

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

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

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

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

ほかのトラック

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

Web版