メインコンテンツへ
アルゴリズムとプログラミング値渡しと参照渡し

次の疑似コードを実行した後、変数 a と b の値として正しいものはどれか。 ``` function swap_by_value(x, y): // 値渡し temp = x x = y y = temp function swap_by_ref(ref x, ref y): // 参照渡し temp = x x = y y = temp a = 1 b = 2 swap_by_ref(a, b) // 参照渡しで呼び出す // この時点での a, b は? ```

ア.a=1, b=2(変わらない)
イ.a=1, b=1
ウ.a=2, b=2
エ.a=2, b=1(入れ替わる)正解

解説

参照渡しは「地図を手渡す」方式。コピーではなく「本物の場所(アドレス)」を教えるため、関数の中で値を変えると元の変数も変わる。swap_by_ref では a と b の実体を直接入れ替えるので、呼び出し元の a と b も入れ替わる。

なぜ エ が正解か

参照渡し(call by reference)では、引数 a と b の実体(メモリ上のアドレス)が x と y に渡される。関数内で x と y を交換すると、それは呼び出し元の a と b そのものを操作することになる。したがって swap_by_ref(a, b) を呼んだ後、a=2, b=1 に入れ替わる。一方、値渡し(swap_by_value)で呼んだ場合はコピーが渡されるため a=1, b=2 のまま変わらない。この違いが値渡しと参照渡しの本質的な差。

なぜ ア は間違いか

ア(変わらない)は値渡しで呼んだ場合の結果。本問は参照渡し(swap_by_ref)で呼んでいるため、実体が入れ替わり a=2, b=1 となる。値渡しと参照渡しを混同した典型的な誤り。

なぜ イ は間違いか

swap 処理で一方の値が消えることはない。temp 変数を使った3ステップ交換では元の値が必ず保持される。temp の役割を理解していない誤り。

なぜ ウ は間違いか

同様に swap 処理で両方が同じ値になることはない。temp による3ステップ交換の仕組みを誤解した誤り。

出典: AI生成問題(学習用)