基本情報技術者 2012年 春期 午前(科目A) 問49
問題文
サブルーチンへの引数の渡し方のうち、変数を引数として渡しても、サブルーチンの実行後に変数の値が変更されないことが保証されているものはどれか。
選択肢
ア:値呼出し(正解)
イ:結果呼出し
ウ:参照呼出し
エ:名前呼出し
🔒 解説は解答すると表示されます
サブルーチンの引数渡し方式【午前解説】
正解の理由
値呼出し(call by value)は、サブルーチンに渡す際に実引数の値をコピーして仮引数に渡します。サブルーチン内で仮引数を書き換えても、それはコピーされた領域の変更に過ぎず、元の実引数(呼び出し側の変数)には一切影響しません。したがって「サブルーチンの実行後に変数の値が変更されないことが保証されている」選択肢は ア(値呼出し)です。
解法ステップ
- 各呼出し方式の定義を頭に思い浮かべる(値、参照、結果、名前)。
- 「サブルーチン実行後に元変数が変わるか」を基準に、それぞれの方式での影響を考える。
- 値がコピーされる方式なら“変更されない”と判断し、他は“変更される可能性あり”とする。
- 選択肢を照合して値渡し(ア)を選ぶ。
選択肢別の誤答解説
- ア 値呼出し:正解。実引数はコピーされ、サブルーチン内の変更は呼び出し元に反映されません。
- イ 結果呼出し:誤り。サブルーチン終了時に仮引数の値が実引数へコピーされるため、呼び出し後に実引数が更新され得ます(outパラメータ)。
- ウ 参照呼出し:誤り。仮引数は実引数の参照(アドレス)を受け取り、直接実引数を操作できるため呼び出し後に変化します。
- エ 名前呼出し:誤り。名前呼出しは実引数を評価するための遅延評価(サブルーチン内で実引数を評価する機構)で、副作用が実引数へ及ぶことがあり保証されません(Algolのthunkなど)。
よくある誤解
- CやPythonの挙動と混同する:Cはスカラーは値渡しですが、ポインタを渡すと間接的に元が変わるため「値渡し=絶対に変更されない」と誤解しがちです。
- 「名前呼出しは安全」と誤解:名前呼出し(call by name)は実際にはテキスト置換的な評価で副作用が元に影響する場合があり、安全とは言えません。
- 「結果呼出しは変更されない」と思う:結果呼出し(out/result)はサブルーチン終了時に値が戻されるため、結果的に実引数が更新される可能性が高く、保証されません。
補足コラム
言語ごとの実装例と注意点:
- C/C++:スカラーは値渡し。ポインタや参照を渡すと元が変わる(間接的に参照渡し)。
- Pascal:通常は値渡し(value)、変数を参照渡しする場合は var を使う。
- Java/Python:厳密には「参照の値を渡す」(call by sharing)で、ミュータブルなオブジェクトは変更され得るがイミュータブルな値は変わらない。
- 古典的言語の名前呼出し:Algol の call-by-name はサブルーチン内で実引数が繰り返し評価され、期待しない副作用を生むことがある。
コード例(動作イメージ)
// C: 値渡しの例(intは値渡し)
void inc(int x) {
x = x + 1; // 呼び出し元の変数には影響しない
}
int a = 1;
inc(a); // a は 1 のまま
# Python: オブジェクト参照のコピー(call by sharing)
def append_item(lst):
lst.append(100) # 呼び出し元のリストが変更される
L = [1,2,3]
append_item(L) # L は変更される
FAQ
Q1: C言語では「値渡し」が多いが、元が変わることがあるのはなぜ?
A1: Cは変数の値(例えばポインタの値)を渡すため、ポインタの値を通じて間接的にメモリを書き換えれば呼び出し元は変わります。これは「ポインタを値渡ししている」だけで、参照渡しとは異なる点です。
A1: Cは変数の値(例えばポインタの値)を渡すため、ポインタの値を通じて間接的にメモリを書き換えれば呼び出し元は変わります。これは「ポインタを値渡ししている」だけで、参照渡しとは異なる点です。
Q2: 名前呼出しはどのような場面で使われるのですか?
A2: 現代の主流言語ではほとんど使われませんが、Algolのような古い言語での論理や遅延評価のモデルとして歴史的に重要です。副作用の扱いに注意が必要です。
A2: 現代の主流言語ではほとんど使われませんが、Algolのような古い言語での論理や遅延評価のモデルとして歴史的に重要です。副作用の扱いに注意が必要です。
Q3: 「結果呼出し」と「参照呼出し」の違いは?
A3: 結果呼出しはサブルーチン終了時に仮引数の内容を実引数にコピーする(out)。参照呼出しは実引数の参照を使ってサブルーチン内で直接操作する(in/out両方可能)。
A3: 結果呼出しはサブルーチン終了時に仮引数の内容を実引数にコピーする(out)。参照呼出しは実引数の参照を使ってサブルーチン内で直接操作する(in/out両方可能)。
関連キーワード: 値呼出し、結果呼出し、参照呼出し、名前呼出し、呼び出し方式、副作用、コピー渡し、アウトパラメータ

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

