平成23年度 秋期 午前 問22
ソフトウェア
変数に関する問題
メインプログラムを実行した結果はどれか。ここで,static は静的割当てを,auto は動的割当てを表す。
メインプログラム ┌──────────────────┐ │ auto int x, y; │ │ x = f(2) + f(2); │ │ y = g(2) + g(2); │ └──────────────────┘ 関数 f(u) 関数 g(u) ┌──────────────────┐ ┌────────────────────┐ │ auto int u; │ │ auto int u; │ │ auto int v = 1; │ │ static int v = 1; │ │ v = v + u; │ │ v = v + u; │ │ return v; │ │ return v; │ └──────────────────┘ └────────────────────┘
| x | y | |
|---|---|---|
| ア | 6 | 6 |
| イ | 6 | 8 |
| ウ | 8 | 6 |
| エ | 8 | 8 |
- ア6 6
- イ6 8
- ウ8 6
- エ8 8
答えと解説を見る
✓ これが正解イ6 8
解説
呼ぶたびに作り直すか、残るかで差が出ます。
二つの関数は、見比べるとほとんど同じ形をしています。違うのは、途中で使う変数を動的割当てにしているか、静的割当てにしているかという一点だけです。動的割当ての変数は、その関数が呼ばれるたびに作られ、抜けると消えます。ですから何度呼んでも、毎回おなじ初期の値から始まります。静的割当ての変数は、関数を抜けても記憶域が残り続け、初期の値を置くのは最初の一度だけです。ですから前の呼出しで書き換えた値が、次の呼出しに持ち越されます。この差は一度目の呼出しでは目に見えません。どちらも初期の値から始まるので、返る値は同じになります。差が出るのは二度目です。作り直す側はまた初期の値に戻り、残る側は前回の結果を土台にして計算を続けます。実際に数えてみます。引数はどちらの関数でも動的割当てなので、ここでは差を生みません。作り直す側は、一度目も二度目も 1 に 2 を足して 3 を返すので、二回ぶんの合計は 6 になります。残る側は、一度目は 1 に 2 を足して 3 を返し、二度目はその 3 に 2 を足して 5 を返すので、合計は 8 になります。作り直す側の合計が x へ、残る側の合計が y へ入りますから、x が 6、y が 8 と求まります。
ほかの選択肢はなぜ違うのか
- ア6 6:x と y のどちらも 6 になるという組合せです。これは記憶域が残るほうの変数まで、呼出しのたびに作り直されると読んだ場合の値で、二つの指定の違いを取りこぼしています。
- ウ8 6:x が 8 で y が 6 という組合せで、二つの関数の役割をちょうど入れ替えて読んだ場合の値です。記憶域が残る指定が付いているのは、y を作るほうの関数だけです。
- エ8 8:x と y のどちらも 8 になるという組合せです。これは呼出しのたびに作り直されるほうの変数まで、値を次へ持ち越すと読んだ場合に出てくる値にあたります。
出典:平成23年度 秋期 応用情報技術者試験 午前 問22
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)