値呼び出し
引数の渡し方だよ
変数のコピーを渡すよ
プログラミングの話で出てくるよ
簡単に書くよ
値呼び出し(読:アタイヨビダシ 英:call by value)とは
「値渡し」のこと。
用語の中身としては
関数
(処理のまとまり)に変数
(プログラミングにおける値を入れておく箱)を(引数
(関数に渡す値)として)渡すときの「渡し方の種類」のひとつ
であり
渡す変数をコピーして、コピーした変数を「これを使ってね」と渡すやり方
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・変数
・関数
・引数(ヒキスウ)
について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
変数は「プログラミング言語における『値を入れておく箱』」です。
処理の途中で値を入れたり、逆に取り出したりできます。
関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。
引数は「プログラムや関数に渡す値」です。
ちょっと汚い話で恐縮ですが、人間は ご飯を食べて、ウンチを出します。
人間を関数だとすれば、ご飯に相当するものが引数です。
あと、ついでなので書いておくと、ウンチに相当するものは戻り値です。
以上を踏まえて、本題に入ります。
関数に変数を引数として渡すときの渡し方には、実は2種類あります。
それは
1.元の変数をコピーして渡すやり方
2.元の変数の置いてある場所を書いた紙を渡すやり方
の2つです。
この2つの渡し方のうち
1.元の変数をコピーして渡すやり方
が「値呼び出し」です。
「値渡し」とも呼ばれます……というか個人的には「値渡し」という言い方の方が馴染みがあります。
あと、ついでなので書いておくと
2.元の変数の置いてある場所を書いた紙を渡すやり方
の方は「参照呼び出し(参照渡し)」と言います。
気が向いたら、併せて覚えてあげてください。
……と駆け足で説明されても分からないかもしれませんね。
大丈夫です。
例を挙げて説明します。
例えば、そうですね。
ここにピヨ太関数が ありました。
ピヨ太関数は変数「ミカン箱」に値「ミカン1つ」を入れました。
ピヨ太関数は値「ミカン1つ」が入った変数「ミカン箱」をピヨ子関数に引数として渡すことにしました。
まずは値呼び出しから説明します。
値呼び出しの場合、ピヨ太関数は変数「ミカン箱」をコピーします。
※ピヨの左手ピヨの右手(ピヨピヨフェイク)の詳細が気になる方は、用語「ピヨの左手ピヨの右手」の説明を ご覧ください。
次に、コピーした変数「ミカン箱」を「これを使ってね」とピヨ子関数に渡します。
これが値呼び出しです。
変数「ミカン箱」は2つに分身します。
おっと!大変です。
ピヨ子関数が変数「ミカン箱」の中にあるミカンを食べてしまいました。
でも大丈夫です。
ピヨ子関数に渡したのはコピーした変数「ミカン箱」です。
ピヨ太関数の手元にある変数「ミカン箱」の中身のミカンは残っています。
これが値呼び出しの特徴です。
呼び出した関数内で変数の値を書き換えても、呼び出し元の変数は影響を受けない
のです。
「えっ?それって普通じゃないの?」と思う人もいるでしょう。
プログラミングを始めたばっかりの人ほど「普通のことを何もったいぶって説明してるんだ」と感じるはずです。
まぁ、落ち着いて最後まで読んでくださいな。
次に参照呼び出しの説明をします。
参照呼び出しでは、ピヨ太関数はピヨ子関数に「変数『ミカン箱』の置いてある場所」を書いた紙を渡します。
「変数『ミカン箱』を使いたければ、この紙を頼りに探して、見つかった変数『ミカン箱』を使ってね!」なのです。
これが参照呼び出しです。
値呼び出しのときと違って、変数「ミカン箱」は分身しません。
1つだけです。
おっと!大変です。
ピヨ子関数が「変数『ミカン箱』の置いてある場所」を書いた紙をもとにして変数「ミカン箱」を見つけ、変数「ミカン箱」の中にあるミカンを食べてしまいました。
ピヨ子関数がミカンを食べた変数「ミカン箱」は、ピヨ太関数の手元にある変数「ミカン箱」と同じものです。
ピヨ太関数の手元にある変数「ミカン箱」の中にあるミカンが、なくなってしまいました。
これが参照呼び出しの特徴です。
呼び出した関数内で変数の値を書き換えると、呼び出し元の変数の中身も書き変わる
のです。
並べて書くと、以下のようになります。
■値呼び出し
・変数のコピーを渡す
・変数の中身を書き換えても呼び出し元には影響しない
■参照呼び出し
・変数の置いてある場所を書いた紙を渡す
・変数の中身を書き換えると呼び出し元の変数の中身も書き変わる
せっかくなので、もう少しプログラミングっぽい例も挙げてみましょう。
例えば、引数を値呼び出しする以下の処理があったとします。
ピヨ太関数(){
ミカン箱=ミカン1
ピヨ子関数呼び出し(【値呼び出し】ミカン箱)
ミカン箱の中身を表示
}
ピヨ子関数(ミカン箱){
ミカン箱=ミカン0
}
この処理を実行すると
ミカン1
と表示されます。
ピヨ子関数の中で何が起ころうと影響を受けないからです。
ピヨ太関数がミカン箱に対してやった処理は
1.ミカン箱=ミカン1
2.ミカン箱の中身を表示
の2つだけです。
引数を参照呼び出しする以下の処理もありました。
ピヨ太関数(){
ミカン箱=ミカン1
ピヨ子関数呼び出し(【参照呼び出し】ミカン箱)
ミカン箱の中身を表示
}
ピヨ子関数(ミカン箱){
ミカン箱=ミカン0
}
こちらの処理は、実行すると
ミカン0
と表示されます。
ピヨ太関数のミカン箱とピヨ子関数のミカン箱は同じものだからです。
ピヨ太関数がミカン箱に対してやった処理は
1.ミカン箱=ミカン1
2.ミカン箱=ミカン0(ピヨ子関数の中でやった処理結果が反映される)
3.ミカン箱の中身を表示
の3つになります。
これが値呼び出しと参照呼び出しの違いです。
基本的に、関数に対して情報を与えたいだけの場合は値呼び出しを使います。
呼び出し元から呼び出し先の関数に対する一方通行の場合です。
関数内での変更を呼び出し元にも反映したい場合は参照呼び出しを使います。
呼び出し元と呼び出し先の関数で双方向のやり取りをしたい場合です。
「どっちにすれば良いのかな?」と迷った場合は「値呼び出し」にしてください。
値呼び出しの方が考え方も単純ですし影響範囲も分かりやすいはずです。
それで進めてみて「値呼び出しでは無理だな!」と分かった時点で参照呼び出しに変更しましょう。
特にプログラミング初心者の場合は「全部、値呼び出しで作ってやるぜ!」な心持ちでいて、どうしても実現できないところだけ参照呼び出しを使うようにした方がバグ(プログラムの おかしいところ)は少なくなると思います。
一言でまとめるよ
まぁ「値呼び出し」って単語が出てきたら「変数
(プログラミングにおける値を入れておく箱)をコピーして渡す、引数の渡し方なんだな~」と お考えください。






