応用情報技術者 2013年 春期 午前2 問20
問題文
メインプログラムを実行した後、メインプログラムの変数X,Yの値は幾つになるか。ここで、仮引数Xは値呼出し(call by value)、仮引数Yは参照呼出し(call by reference)であるとする。


選択肢
ア:
イ:(正解)
ウ:
エ:
メインプログラムの変数X,Yの値の変化【午前2 解説】
要点まとめ
- 結論:メインプログラムのXは2、Yは6になるのが正解です。
- 根拠:Xは値呼出しでコピー渡しされるため元の値は変わらず、Yは参照呼出しで直接操作されるため値が変わります。
- 差がつくポイント:値呼出しと参照呼出しの違いを正確に理解し、手続き内の計算順序を追うことが重要です。
正解の理由
メインプログラムのXは値呼出しなので、add手続き内でのXの変更はメイン側に影響しません。一方、Yは参照呼出しなので、add内でのYの変更はメインプログラムのYに反映されます。計算過程は以下の通りです。
- メイン側:X=2, Y=2
- add呼出し時:
- 仮引数X = 2(コピー)
- 仮引数Y = メインのYを参照
- add内処理:
- X = X + Y → 2 + 2 = 4(仮引数Xのみ変更)
- Y = X + Y → 4 + 2 = 6(参照先のYが6に更新)
- add終了後:
- メインのXは変わらず2
- メインのYは6に変わる
したがって、正解はイの「X=2、Y=6」です。
よくある誤解
値呼出しと参照呼出しの違いを混同し、両方の変数が変更されると誤解しがちです。特に、手続き内のXの変更がメイン側に影響しない点を見落としやすいです。
解法ステップ
- メインプログラムの初期値を確認(X=2, Y=2)。
- 仮引数の呼出し方法を確認(Xは値呼出し、Yは参照呼出し)。
- add手続き内の処理を順に追う。
- 値呼出しのXは手続き内で変わってもメイン側は変わらないと理解。
- 参照呼出しのYは手続き内の変更がメイン側に反映される。
- 最終的なメインプログラムのX,Yの値を算出。
選択肢別の誤答解説
- ア(X=2, Y=4):Yの更新計算を途中で止めてしまい、正しい計算結果6に至っていません。
- イ(X=2, Y=6):正解。値呼出しと参照呼出しの違いを正しく理解し計算しています。
- ウ(X=4, Y=2):Xが値呼出しなのに手続き内の変更がメインに反映されると誤解しています。
- エ(X=4, Y=6):Xも参照呼出しと誤認し、両方の値が変わると誤解しています。
補足コラム
値呼出し(call by value)は引数の値をコピーして渡すため、手続き内の変更は呼び出し元に影響しません。一方、参照呼出し(call by reference)は引数の実体を渡すため、手続き内の変更が呼び出し元の変数に直接反映されます。プログラミング言語によって呼出し方法のデフォルトが異なるため、仕様を正確に理解することが重要です。
FAQ
Q: 値呼出しと参照呼出しの違いは何ですか?
A: 値呼出しは引数の値をコピーして渡し、参照呼出しは変数の実体を渡して直接操作します。
A: 値呼出しは引数の値をコピーして渡し、参照呼出しは変数の実体を渡して直接操作します。
Q: 参照呼出しで渡された変数は手続き内で変更するとどうなりますか?
A: 呼び出し元の変数の値が直接変更されます。
A: 呼び出し元の変数の値が直接変更されます。
Q: この問題でXが参照呼出しだったらどうなりますか?
A: 手続き内でXが4に変わるため、メインプログラムのXも4になります。
A: 手続き内でXが4に変わるため、メインプログラムのXも4になります。
関連キーワード: 値呼出し、参照呼出し、引数渡し、手続き、変数のスコープ、プログラミング基礎

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

