過去問解きまくり研究所 ホーム

平成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;          │
  └──────────────────┘      └────────────────────┘
xy
ア66
イ68
ウ86
エ88
答えと解説を見る

✓ これが正解イ6 8

解説

呼ぶたびに作り直すか、残るかで差が出ます。

二つの関数は、見比べるとほとんど同じ形をしています。違うのは、途中で使う変数を動的割当てにしているか、静的割当てにしているかという一点だけです。動的割当ての変数は、その関数が呼ばれるたびに作られ、抜けると消えます。ですから何度呼んでも、毎回おなじ初期の値から始まります。静的割当ての変数は、関数を抜けても記憶域が残り続け、初期の値を置くのは最初の一度だけです。ですから前の呼出しで書き換えた値が、次の呼出しに持ち越されます。この差は一度目の呼出しでは目に見えません。どちらも初期の値から始まるので、返る値は同じになります。差が出るのは二度目です。作り直す側はまた初期の値に戻り、残る側は前回の結果を土台にして計算を続けます。実際に数えてみます。引数はどちらの関数でも動的割当てなので、ここでは差を生みません。作り直す側は、一度目も二度目も 1 に 2 を足して 3 を返すので、二回ぶんの合計は 6 になります。残る側は、一度目は 1 に 2 を足して 3 を返し、二度目はその 3 に 2 を足して 5 を返すので、合計は 8 になります。作り直す側の合計が x へ、残る側の合計が y へ入りますから、x が 6、y が 8 と求まります。

ほかの選択肢はなぜ違うのか

出典:平成23年度 秋期 応用情報技術者試験 午前 問22

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)