応用情報技術者 2011年 秋期 午前2 問22
問題文
メインプログラムを実行した結果はどれか。ここで,staticは静的割当てを,autoは動的割当てを表す。


選択肢
ア:
イ:(正解)
ウ:
エ:
メインプログラムの実行結果【午前2 解説】
要点まとめ
- 結論:関数fの戻り値は6、関数gの戻り値は8となり、x=6、y=8が正解です。
- 根拠:fのvはautoで毎回初期化されるが、gのvはstaticで値が保持されるため累積されます。
- 差がつくポイント:static変数の寿命と初期化タイミングを理解し、関数呼び出しごとの挙動を正確に追うことが重要です。
正解の理由
関数fの変数vはauto(自動変数)で、関数呼び出しのたびに初期化されます。
1回目のf(2)呼び出しではv=1+2=3、2回目も同様に3なので合計は6。
一方、関数gのvはstatic(静的変数)で初期化は1回だけ。
1回目のg(2)呼び出しでv=1+2=3、2回目は前回のv=3に2を足して5となり、合計は3+5=8。
したがってx=6、y=8となり、選択肢イが正解です。
1回目のf(2)呼び出しではv=1+2=3、2回目も同様に3なので合計は6。
一方、関数gのvはstatic(静的変数)で初期化は1回だけ。
1回目のg(2)呼び出しでv=1+2=3、2回目は前回のv=3に2を足して5となり、合計は3+5=8。
したがってx=6、y=8となり、選択肢イが正解です。
よくある誤解
static変数は初期化が1回だけで値が保持されるため、毎回初期化されるauto変数と混同しやすいです。
また、関数呼び出しごとの変数の寿命を正しく理解していないと誤答につながります。
また、関数呼び出しごとの変数の寿命を正しく理解していないと誤答につながります。
解法ステップ
- 関数fのvはautoなので呼び出しごとにv=1で初期化されると認識する。
- f(2)の処理を追い、v = 1 + u = 3を返すことを確認する。
- f(2)を2回呼び出すのでx = 3 + 3 = 6となる。
- 関数gのvはstaticなので初期化は1回だけ、値は保持されると理解する。
- 1回目のg(2)呼び出しでv = 1 + 2 = 3を返す。
- 2回目のg(2)呼び出しで前回のv=3に2を足しv=5を返す。
- y = 3 + 5 = 8となる。
- 結果x=6、y=8を選択肢と照合し、イを選ぶ。
選択肢別の誤答解説
- ア(x=6, y=6):gのvをstaticと認識せず、毎回初期化されると誤解している。
- イ(x=6, y=8):正解。fはauto、gはstaticの違いを正しく理解。
- ウ(x=8, y=6):fのvをstaticと誤認し、gのvをautoと誤認している。
- エ(x=8, y=8):両方のvをstaticと誤認し、初期値の加算を誤っている。
補足コラム
C言語などでのauto変数は関数呼び出しごとに生成・破棄される一時的な変数です。
一方、static変数はプログラムの実行期間中ずっとメモリに存在し、初期化は1回だけ行われます。
この違いを理解することは、関数の状態管理や副作用の把握に不可欠です。
一方、static変数はプログラムの実行期間中ずっとメモリに存在し、初期化は1回だけ行われます。
この違いを理解することは、関数の状態管理や副作用の把握に不可欠です。
FAQ
Q: static変数はどのタイミングで初期化されますか?
A: プログラム開始時に1回だけ初期化され、その後は値が保持され続けます。
A: プログラム開始時に1回だけ初期化され、その後は値が保持され続けます。
Q: auto変数はどのくらいの期間メモリに存在しますか?
A: 関数の実行中のみ存在し、関数終了時に破棄されます。
A: 関数の実行中のみ存在し、関数終了時に破棄されます。
Q: static変数はスレッドセーフですか?
A: 通常はスレッド間で共有されるため、スレッドセーフではありません。同期処理が必要です。
A: 通常はスレッド間で共有されるため、スレッドセーフではありません。同期処理が必要です。
関連キーワード: static変数、auto変数、変数の寿命、関数呼び出し、メモリ割当て、C言語、変数の初期化、プログラム実行結果

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

