平成28年度 春期 午前 問20
ソフトウェア
値呼出しに関する問題
メインプログラムを実行した後,メインプログラムの変数 X,Y の値は幾つになるか。ここで,仮引数 X は値呼出し(call by value),仮引数 Y は参照呼出し(call by reference)であるとする。
〔プログラム〕 枠が 2 つ横に並ぶ。
メインプログラム … X=2; / Y=2; / add(X, Y);
手続 add(X, Y) … X=X+Y; / Y=X+Y; / return;
| X | Y | |
|---|---|---|
| ア | 2 | 4 |
| イ | 2 | 6 |
| ウ | 4 | 2 |
| エ | 4 | 6 |
- ア2 4
- イ2 6
- ウ4 2
- エ4 6
答えと解説を見る
✓ これが正解イ2 6
解説
値呼出しは写しを渡し、参照呼出しは入れ物ごと渡します。
設問は、仮引数のうち一方を値呼出し、もう一方を参照呼出しと定めています。二つの渡し方の違いを先に固めれば、あとは一行ずつ追うだけです。値呼出しは呼ぶときに値を写して渡すので、手続の中の変数は別の入れ物になります。書き換えても呼び出し側には返りません。参照呼出しは入れ物の場所そのものを渡すので、手続の中の変数は呼び出し側の変数と同じものです。書き換えれば呼び出し側も変わります。では追います。メイン側はXもYも2の状態で手続を呼びます。手続に入った直後、写しで渡されたXは2、場所で渡されたYはメイン側のYと同じ入れ物で2です。一行目でXにXとYの和を入れると4になりますが、動いたのは写しのほうだけなので、メインのXは2のままです。二行目でYにXとYの和を入れます。右辺のXは一行目で4になった写しの値、右辺のYはまだ書き換えていないので2ですから、和は6です。この行は場所を渡した側なので、メインのYが6になります。手続から戻ると写しは捨てられ、メイン側にはXが2、Yが6で残ります。追うときは呼び出し側と手続側を二つの列に分けて書くと混ざりません。
ほかの選択肢はなぜ違うのか
- ア2 4:二行目の右辺のXを、更新される前の2のまま計算した形です。代入は上から順に効くので、二行目に進んだ時点でその値はすでに4になっています。
- ウ4 2:二つの渡し方を入れ替えて読んだ形です。呼び出し側へ結果が返るのは入れ物の場所を渡したほうなので、返る変数と返らない変数が逆になっています。
- エ4 6:両方とも入れ物の場所を渡したものとして読んだ形です。写しを渡したほうは手続を出た時点で捨てられるため、呼び出し側の値は動きません。
出典:平成28年度 春期 応用情報技術者試験 午前 問20
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)