CO-P09情報Ⅰ 対策問題

コンピュータとプログラミングプログラミング特訓 (第3問対策)

次のプログラムは2つの変数の値を交換するつもりで書いたが、正しく動かない。 (1) a = 5 (2) b = 8 (3) a = b (4) b = a (5) 表示する(a, b) 実行結果と、その理由として正しいものはどれか。

解答・解説を見る

正解: 1

正答

1

この問題のポイント

上書きによる値の消失(交換バグの理解) を問う問題です。

解説

代入「a = b」は「b の今の値を a にコピーして上書きする」という意味で、a に元々あった値はその瞬間に消えます。この「上書きすると前の値は戻らない」性質が、このバグの正体です。

a と b の値を1行ずつトレースします。
(1)の実行後: a=5、b=8。
(2)の実行後: a=5、b=8。
(3) a = b の実行後: a=8、b=8。a の元の値5がここで失われる
(4) b = a の実行後: b には「今の a」=8 が入るので、a=8、b=8 のまま。
(5)の表示は「8 8」となります。

(4)の時点では、a はもう5ではなく8です。「a = b と b = a を書けば入れ替わる」という直感は、代入を「移動」だと誤解しているのが原因で、実際の代入は「コピーして上書き」です。正しく交換するには、消える前の値を退避する一時変数が必要です: tmp = a → a = b → b = tmp の3行。

この「一時変数による交換」は、バブルソートや選択ソートで要素を入れ替えるときに必ず出てくる定番イディオムです。共通テストでも「なぜ tmp が必要か」「tmp なしだとどうなるか」を問う形で出題されるので、この失敗例(8 8 になる)とセットで説明できるようにしておきましょう。

選択肢の確認

1.○ (3)の上書きで5が失われ、(4)では新しい a=8 が入るため 8 8。
2.× 一時変数なしでは交換できない。8 5 にはならない。
3.× (3)(4)の代入で a は確実に書き換わる。
4.× 失われるのは b ではなく a の元の値(5)。

ここだけは覚えよう

代入は「コピーして上書き」、前の値は消える — 交換は tmp=a → a=b → b=tmp の3行が鉄則。

関連問題

CO-P08CO-P10