次は道が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つずつ計算します。
点 >= 80→ 72 >= 80 → 偽点 != 0→ 72 != 0 → 真(!=は「等しくない」)点 >= 60 かつ 点 < 80→ 真 かつ 真 → 真
まず変数を今の値に置き換えて、それから比べる。この2段階を口に出すと、勘違いが激減します。
通らなかった行が、いちばん怪しい
分岐のバグには特徴があります。通ってほしい行が通っていないという形で現れるのです。
- 条件の向きが逆(
>=と<=を書き間違えた) - 境界がずれている(80点を合格にしたいのに
> 80と書き、80点が落ちる) - そもそも条件が一度も真にならない
どれも、表を見れば「条件の列がずっと偽」という形で目に見えます。プログラムが黙って何もしないときは、たいていここです。エラーが出ないぶん、かえって気づきにくい種類のバグでもあります。
多段の分岐
else if が連なる形では、上から順に判定して、最初に成り立ったものだけを実行し、残りは見もしないという性質があります。
if (点 >= 80) { 評価 = 'A'; }
else if (点 >= 60) { 評価 = 'B'; }
else { 評価 = 'C'; }点が90のとき、1つ目が真なので 'A' が入り、2つ目の 点 >= 60 は判定すらされません。トレース表にも書きません。この「見もしない」感覚は、条件の順番を間違えたときのバグ(たとえば >= 60 を先に書いてしまう)を見抜く目になります。