平成25年度 春期 午前 問20
開発技術
値呼出しに関する問題
メインプログラムを実行した後,メインプログラムの変数 X,Y の値は幾つになるか。ここで,仮引数 X は値呼出し(call by value),仮引数 Y は参照呼出し(call by reference)であるとする。
〔プログラム〕
メインプログラム 手続 add(X, Y) ┌──────────┐ ┌──────────┐ │ X=2; │ │ X=X+Y; │ │ Y=2; │ │ Y=X+Y; │ │ add(X, Y); │ │ return; │ └──────────┘ └──────────┘
- アX=2 / Y=4
- イX=2 / Y=6
- ウX=4 / Y=2
- エX=4 / Y=6
答えと解説を見る
✓ これが正解イX=2 / Y=6
解説
写しで渡した変数は戻らず、別名の変数は戻ります。
手続の側の変数は仮引数と呼ばれ、名前が同じでも呼ぶ側とは別のものとして扱われます。値呼出しでは値を写して渡しますので、手続の中で書き換えても呼んだ側には戻りません。参照呼出しでは変数のアドレスを渡しますので、同じ入れ物を書き換えることになり、呼んだ側にも反映されます。この違いを先に押さえてから、手続の中を一行ずつ進めます。一行目で二つの値を足した結果が、写しのほうの変数に入ります。二行目の右辺は、その行に来た時点の値で計算しますので、一行目で書き換えた後の値を使います。その結果が別名のほうの変数に入り、呼んだ側の変数も同じ値になります。手続を抜けると写しのほうは捨てられますので、呼んだ側の最初の変数は 2 のままです。二行目の右辺をいつの値で計算するか、という点がこの問の分かれ目です。
ほかの選択肢はなぜ違うのか
- アX=2 / Y=4:二行目の右辺を、一行目で書き換える前の値のまま計算した形です。手続の中の代入は上から順に効きますので、足す相手はすでに 4 になっています。
- ウX=4 / Y=2:二つの受渡し方を取り違えた形です。値を写したほうが呼んだ側へ戻り、アドレスで渡したほうが戻らない、という逆の読みになっています。
- エX=4 / Y=6:二つともアドレスで渡したと読んだ形です。値を写して渡した変数は手続を抜けた時点で捨てられますので、呼んだ側の値は 2 のまま変わりません。
出典:平成25年度 春期 応用情報技術者試験 午前 問20
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)