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


選択肢
ア:
イ:(正解)
ウ:
エ:
メインプログラムの変数X, Yの値は幾つになるか【午前2 解説】
要点まとめ
- 結論:メインプログラムの変数Xは2、Yは6になるのが正解です。
- 根拠:Xは値呼出しでコピー渡しされるため変更は反映されず、Yは参照呼出しで元の変数が更新されるため値が変わります。
- 差がつくポイント:値呼出しと参照呼出しの違いを正確に理解し、手続き内の計算結果がどの変数に影響するかを見極めることが重要です。
正解の理由
手続きaddの仮引数Xは値呼出しなので、メインプログラムのXの値は変更されません。一方、仮引数Yは参照呼出しなので、add内でのYの変更はメインプログラムのYに反映されます。計算過程は以下の通りです。
- メインプログラムのX=2、Y=2
- add呼出し時、仮引数Xに2(値渡し)、仮引数YにメインのYの参照が渡る
- add内でX = X + Y → X = 2 + 2 = 4(仮引数Xのみ変更)
- add内でY = X + Y → Y = 4 + 2 = 6(参照渡しのためメインのYが6に更新)
- add終了後、メインのXは変更なしで2、Yは6になる
したがって、正解はイ(X=2、Y=6)です。
よくある誤解
値呼出しでも元の変数が変わると思い込むことが多いです。参照呼出しと値呼出しの違いを混同すると誤答につながります。
解法ステップ
- メインプログラムの変数X, Yの初期値を確認する(X=2、Y=2)。
- 仮引数Xは値呼出し、Yは参照呼出しであることを理解する。
- add手続き内の処理を順に追う。
- X = X + Y の計算は仮引数Xにのみ影響し、メインのXは変わらない。
- Y = X + Y の計算は参照渡しのためメインのYに反映される。
- 最終的なメインプログラムのX, Yの値を答える。
選択肢別の誤答解説
- ア(X=2、Y=4):Yの更新計算を誤り、Y=6になるべきところを4とした。
- イ(X=2、Y=6):正解。値呼出しと参照呼出しの違いを正しく理解。
- ウ(X=4、Y=2):値呼出しのXが変わると誤解し、参照呼出しのYが変わらないと誤認。
- エ(X=4、Y=6):Xも参照渡しと誤解し、両方の値が変わると考えた誤答。
補足コラム
値呼出し(call by value)は引数の値をコピーして渡すため、手続き内での変更は呼び出し元に影響しません。一方、参照呼出し(call by reference)は引数の実体を渡すため、手続き内の変更が呼び出し元の変数に反映されます。プログラミング言語によって呼出し方法は異なり、C言語は基本的に値渡しですがポインタで参照渡しを実現します。理解はプログラムの副作用を予測する上で不可欠です。
FAQ
Q: 値呼出しと参照呼出しの違いは何ですか?
A: 値呼出しは引数の値をコピーして渡すため、手続き内の変更は呼び出し元に影響しません。参照呼出しは引数の実体を渡すため、手続き内の変更が呼び出し元に反映されます。
A: 値呼出しは引数の値をコピーして渡すため、手続き内の変更は呼び出し元に影響しません。参照呼出しは引数の実体を渡すため、手続き内の変更が呼び出し元に反映されます。
Q: なぜXは手続き内で変わってもメインプログラムのXは変わらないのですか?
A: Xは値呼出しなので、手続き内での変更はコピーに対して行われ、元の変数には影響しないためです。
A: Xは値呼出しなので、手続き内での変更はコピーに対して行われ、元の変数には影響しないためです。
関連キーワード: 値呼出し、参照呼出し、引数渡し、プログラムの副作用、変数のスコープ

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

