システムアーキテクト 2025年 午前2 問09
問題文
サブルーチンとの引数の受渡し方のうち、引数として渡した変数の値が、サブルーチンの実行後に変更されないことが保証されているものはどれか。
選択肢
ア:値呼出し(正解)
イ:結果呼出し
ウ:参照呼出し
エ:名前呼出し
サブルーチンの引数の受渡し方式と値の保護【午前2 解説】
要点まとめ
- 結論: 値呼出しは引数の「値のコピー」を渡す方式で、サブルーチン実行後に呼び出し元の変数が変更されないことを保証します。
- 根拠: コピーに対する操作は呼び出し先の局所的なものに留まり、元の記憶域(呼び出し元変数)は参照・上書きされません。
- 差がつくポイント: 参照呼出しや結果呼出し、名前呼出しは呼び出し元へ影響を与える可能性があるため副作用・エイリアスに注意が必要です。
正解の理由
正解は ア(値呼出し)です。値呼出し(call by value)は引数の実際の値をコピーしてサブルーチンに渡すため、サブルーチン内でそのコピーを変更しても呼び出し元の変数には一切影響しません。問題文は「サブルーチンの実行後に変更されないことが保証されているもの」を問うており、値呼出しのみがその保証を満たします。
よくある誤解(2〜3 行)
- Java のオブジェクト参照の扱いを「参照呼出し」と混同し、Java は実際には参照の値をコピーする値呼出しであると誤解されます。
- 結果呼出し(value-result)は戻り値で呼び出し元を更新するため、変更されないとは言えません。
解法ステップ
- 問題文で「実行後に変更されないことが保証される」とある点を明確に把握する。
- 各呼出し方式の定義を思い出す(値コピー、参照渡し、結果の書戻し、名前置換)。
- 「元の記憶域が変更されるか」を基準に選択肢を比較する。
- コピーのみを操作する方式(値呼出し)を選び、他は副作用を理由に除外する。
選択肢別の誤答解説
- ア: ア 値呼出し — 正解。値のコピーが渡されるため、呼び出し元の変数は変更されません。
- イ: 結果呼出し — 間違い。サブルーチン終了時に実引数に結果を書き戻す方式で、呼び出し元の値は更新され得ます。
- ウ: 参照呼出し — 間違い。実引数のアドレスや参照を渡すため、サブルーチン内の変更が呼び出し元に反映されます。
- エ: 名前呼出し — 間違い。名前を置換するモデルでは呼び出し元の変数が副作用を受ける可能性があり、変更されないとは言えません(評価の遅延やスロットルがある場合はさらに複雑)。
補足コラム(関連知識など)
- 言語の実装例: C言語の基本的なパラメータは値呼出し、Fortran や Pascal では値・参照・値結果など複数の実装が存在します。
- Java は「参照の値を値呼出し」している点が混乱の元です。オブジェクト自体は共有され得ますが、参照変数そのものはコピーされます。
- パフォーマンス面では大きなデータ構造を毎回コピーする値呼出しはコストが高く、言語は参照やコピーオンライトなどで対処することがあります。
FAQ
Q: 値呼出しはすべての副作用を完全に防げますか?
A: 値呼出しは呼び出し元の変数そのものを変更しませんが、引数が参照を含む構造(ポインタやオブジェクト参照)の場合、その参照先の状態は変更され得ます。
A: 値呼出しは呼び出し元の変数そのものを変更しませんが、引数が参照を含む構造(ポインタやオブジェクト参照)の場合、その参照先の状態は変更され得ます。
Q: Java は値呼出しですか、参照呼出しですか?
A: Java のパラメータ渡しは「値呼出し」で、オブジェクト参照の「値」が渡されます。したがって参照先オブジェクトは変更され得ますが、呼び出し元の参照変数自体が別の参照に置き換わることはありません。
A: Java のパラメータ渡しは「値呼出し」で、オブジェクト参照の「値」が渡されます。したがって参照先オブジェクトは変更され得ますが、呼び出し元の参照変数自体が別の参照に置き換わることはありません。
関連キーワード: サブルーチン、引数受渡し、値呼出し、参照呼出し、結果呼出し、名前呼出し、副作用、エイリアス

\ せっかくなら /
システムアーキテクトを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

