メインプログラムを実行した後,メインプログラムの変数X,Yの値は幾つになるか。
ここで,仮引数Xは値呼出し(call by value),仮引数Yは参照呼出し(call by reference)であるとする。
〔メインプログラム〕
X=2;
Y=2;
add(X,Y);
〔手続 add(X,Y)〕
X=X+Y;
Y=X+Y;
return;
正答2
解説
正解は2です。
値呼出しと参照呼出しの違いを、手続の実行結果で問う問題です。
値呼出しでは値のコピーが渡されるため、手続内で変更しても呼出し元の変数は変わりません。
参照呼出しでは変数の格納場所が渡されるため、手続内の変更が呼出し元に反映されます。
【計算】
呼出し時点で、手続内のXには2がコピーされ、手続内のYはメインのYを指します。
手続のX=X+Yで、手続内のXは2+2=4になります。
Xは値呼出しなので、メインのXは2のままです。
手続のY=X+Yで、Yは4+2=6になります。
Yは参照呼出しなので、メインのYも6になります。
したがって、実行後はX=2、Y=6です。
【選択肢別解説】
1:× Y=4は、Yを計算するときのXを2のまま扱った値です。
手続内のXは直前の行で4に更新されています。
2:○ メインのXは値呼出しのため2のまま、メインのYは参照呼出しのため6になります。
3:× X=4は、値呼出しの変更が呼出し元に反映されると誤解した値です。
Y=2も参照呼出しの効果を無視しています。
4:× Y=6は正しいものの、X=4は誤りです。
手続内のXの変更は、値呼出しのためメインのXに戻りません。
【ポイント】
値呼出しは「コピーを渡す」、参照呼出しは「格納場所を渡す」と覚えます。
手続内では更新後の値を使って次の行を計算するので、1行ずつ値を追うことが大切です。