「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

値呼び出し

pointこの用語のポイント

point引数の渡し方だよ

point変数のコピーを渡すよ

pointプログラミングの話で出てくるよ

スポンサーリンク

簡単に書くよ

値呼び出し(読:アタイヨビダシ 英:call by value)とは

「値渡し」のこと。
用語の中身としては

関数(処理のまとまり)に変数(プログラミングにおける値を入れておく箱)(引数(関数に渡す値)として)渡すときの「渡し方の種類」のひとつ
であり

渡す変数をコピーして、コピーした変数を「これを使ってね」と渡すやり方
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

変数
関数
引数(ヒキスウ)


について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

変数は「プログラミング言語における『値を入れておく箱』」です。
処理の途中で値を入れたり、逆に取り出したりできます。

値呼び出し

関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。

値呼び出し2

引数は「プログラムや関数に渡す値」です。

値呼び出し3

ちょっと汚い話で恐縮ですが、人間は ご飯を食べて、ウンチを出します。

値呼び出し4

人間を関数だとすれば、ご飯に相当するものが引数です。
あと、ついでなので書いておくと、ウンチに相当するものは戻り値です。

値呼び出し5

以上を踏まえて、本題に入ります。

関数に変数を引数として渡すときの渡し方には、実は2種類あります。
それは

1.元の変数をコピーして渡すやり方
2.元の変数の置いてある場所を書いた紙を渡すやり方


の2つです。

値呼び出し6

この2つの渡し方のうち

1.元の変数をコピーして渡すやり方

が「値呼び出し」です。
値渡し」とも呼ばれます……というか個人的には「値渡し」という言い方の方が馴染みがあります。

値呼び出し7

あと、ついでなので書いておくと

2.元の変数の置いてある場所を書いた紙を渡すやり方

の方は「参照呼び出し参照渡し」と言います。
気が向いたら、併せて覚えてあげてください。

値呼び出し8

……と駆け足で説明されても分からないかもしれませんね。
大丈夫です。
例を挙げて説明します。

例えば、そうですね。

ここにピヨ太関数が ありました。

値呼び出し9

ピヨ太関数は変数「ミカン箱」に値「ミカン1つ」を入れました。

値呼び出し10

ピヨ太関数は値「ミカン1つ」が入った変数「ミカン箱」をピヨ子関数に引数として渡すことにしました。

値呼び出し11

まずは値呼び出しから説明します。

値呼び出しの場合、ピヨ太関数は変数「ミカン箱」をコピーします。

値呼び出し12

※ピヨの左手ピヨの右手(ピヨピヨフェイク)の詳細が気になる方は、用語「ピヨの左手ピヨの右手」の説明を ご覧ください。

次に、コピーした変数「ミカン箱」を「これを使ってね」とピヨ子関数に渡します。

値呼び出し13

これが値呼び出しです。
変数「ミカン箱」は2つに分身します。

値呼び出し14

おっと!大変です。
ピヨ子関数が変数「ミカン箱」の中にあるミカンを食べてしまいました。

値呼び出し15

でも大丈夫です。

ピヨ子関数に渡したのはコピーした変数「ミカン箱」です。
ピヨ太関数の手元にある変数「ミカン箱」の中身のミカンは残っています。

値呼び出し16

これが値呼び出しの特徴です。

呼び出した関数内で変数の値を書き換えても、呼び出し元の変数は影響を受けない

のです。

「えっ?それって普通じゃないの?」と思う人もいるでしょう。
プログラミングを始めたばっかりの人ほど「普通のことを何もったいぶって説明してるんだ」と感じるはずです。

まぁ、落ち着いて最後まで読んでくださいな。

次に参照呼び出しの説明をします。

参照呼び出しでは、ピヨ太関数はピヨ子関数に「変数『ミカン箱』の置いてある場所」を書いた紙を渡します。
「変数『ミカン箱』を使いたければ、この紙を頼りに探して、見つかった変数『ミカン箱』を使ってね!」なのです。

値呼び出し17

これが参照呼び出しです。
値呼び出しのときと違って、変数「ミカン箱」は分身しません。
1つだけです。

値呼び出し18

おっと!大変です。
ピヨ子関数が「変数『ミカン箱』の置いてある場所」を書いた紙をもとにして変数「ミカン箱」を見つけ、変数「ミカン箱」の中にあるミカンを食べてしまいました。

値呼び出し19

ピヨ子関数がミカンを食べた変数「ミカン箱」は、ピヨ太関数の手元にある変数「ミカン箱」と同じものです。
ピヨ太関数の手元にある変数「ミカン箱」の中にあるミカンが、なくなってしまいました。

値呼び出し20

これが参照呼び出しの特徴です。

呼び出した関数内で変数の値を書き換えると、呼び出し元の変数の中身も書き変わる

のです。

並べて書くと、以下のようになります。

■値呼び出し
・変数のコピーを渡す
・変数の中身を書き換えても呼び出し元には影響しない

■参照呼び出し
・変数の置いてある場所を書いた紙を渡す
・変数の中身を書き換えると呼び出し元の変数の中身も書き変わる


せっかくなので、もう少しプログラミングっぽい例も挙げてみましょう。

例えば、引数を値呼び出しする以下の処理があったとします。

ピヨ太関数(){
 ミカン箱=ミカン1

 ピヨ子関数呼び出し(【値呼び出し】ミカン箱)

 ミカン箱の中身を表示

}

ピヨ子関数(ミカン箱){
 ミカン箱=ミカン0
}


この処理を実行すると

ミカン1

と表示されます。

ピヨ子関数の中で何が起ころうと影響を受けないからです。
ピヨ太関数がミカン箱に対してやった処理は

1.ミカン箱=ミカン1
2.ミカン箱の中身を表示


の2つだけです。

引数を参照呼び出しする以下の処理もありました。

ピヨ太関数(){
 ミカン箱=ミカン1

 ピヨ子関数呼び出し(【参照呼び出し】ミカン箱)

 ミカン箱の中身を表示

}

ピヨ子関数(ミカン箱){
 ミカン箱=ミカン0
}


こちらの処理は、実行すると

ミカン0

と表示されます。

ピヨ太関数のミカン箱とピヨ子関数のミカン箱は同じものだからです。
ピヨ太関数がミカン箱に対してやった処理は

1.ミカン箱=ミカン1
2.ミカン箱=ミカン0(ピヨ子関数の中でやった処理結果が反映される)
3.ミカン箱の中身を表示


の3つになります。

これが値呼び出しと参照呼び出しの違いです。

基本的に、関数に対して情報を与えたいだけの場合は値呼び出しを使います。
呼び出し元から呼び出し先の関数に対する一方通行の場合です。

値呼び出し21

関数内での変更を呼び出し元にも反映したい場合は参照呼び出しを使います。
呼び出し元と呼び出し先の関数で双方向のやり取りをしたい場合です。

値呼び出し22

「どっちにすれば良いのかな?」と迷った場合は「値呼び出し」にしてください。
値呼び出しの方が考え方も単純ですし影響範囲も分かりやすいはずです。
それで進めてみて「値呼び出しでは無理だな!」と分かった時点で参照呼び出しに変更しましょう。

特にプログラミング初心者の場合は「全部、値呼び出しで作ってやるぜ!」な心持ちでいて、どうしても実現できないところだけ参照呼び出しを使うようにした方がバグ(プログラムの おかしいところ)は少なくなると思います。


image piyo2

一言でまとめるよ

まぁ「値呼び出し」って単語が出てきたら「変数(プログラミングにおける値を入れておく箱)をコピーして渡す、引数の渡し方なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像053
書籍画像079


書籍画像
わわわ説明術コラム
宣伝だよ
実務で役立つ バックアップの教科書 基本の考え方からツール活用・差分管理・世代管理・データ保全・リストア・リカバリー・可用性の確保まで
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
おい点P、動くんじゃねえ!──ニガテ民のための算数と数学の本