自作関数にいろいろなタイプの戻り値を設定してみよう。

マックス 「はじめるぜ~


自作関数の戻り値の設定し放題のエピソードを」


ソーラー「


今日は


自作関数が実行されたとき


「自作関数への戻り値」を


int型に格納するint型の自作関数について観察していきましょう。」


マックス 「さあ どんな戻り値を設定するか・・」


ソーラー 「


いままでは


自作関数functionを実行する際


function(1);


のように

自作関数function(int a)のint aに


数値1を代入して実行していました」


そのプログラムはこちらです

👇


#include <iostream>


using namespace std;


void function(int a) {


cout << a <<"\n";


return;


}


int main() {


function(1);


return 0;


}



ソーラー「


このプログラムの場合


ビルド実行結果は


1


になります。


このプログラムの自作関数functionの定義を


void function(int a) {


cout << a <<"\n";


return;


}


から


void function(int a) {


cout << 2*a <<"\n";


return;


}



に変更し、




できたプログラム


👇


#include <iostream>


using namespace std;


void function(int a) {


cout <<2*a <<"\n";


return;


}


int main() {


function(1);


return 0;


}


をビルド実行すると


ビルド実行結果は


2


になります。


つまり


function(1);


が実行されると


cout <<2*1 <<"\n";


が実行されるというわけです


さらに


function関数の定義のなかの2*aを a+5にかえた


プログラムを実行してみます


🐤🐤


#include <iostream>


using namespace std;


void function(int a) {


cout <<a+5<<"\n";


return;


}


int main() {


function(1);


return 0;


}


ビルド実行結果


6


ソーラー「


このプログラムの場合は


function(1);

が実行されると


cout <<1+5<<"\n";

が実行されることになります


おまけですが


function(1);


数学におけるy=f(x)のようなものではなく


cout <<1+5<<"\n";


コンピュータに命令をあたえる命令文となっています。


_______________________



ソーラー 「ここで新しいタイプの


おnew自作関数newfunctionの定義を


以下のように

👇

int newfunction (int x){


int y;


y=x+5;


return y;

}


定義します。


そして 今までの自作関数のように


newfunction関数の定義を


int main()がはじまるより


前に持ってきます。


そのプログラムはこちらです

👇


🍓🍓


#include <iostream>


using namespace std;


int newfunction (int x){


int y;


y=x+5;


return y;

}

//↑main関数の前に自作関数の定義をもってきます


int main(){


int a=newfunction(1);


cout<<a<<"\n";


return 0;


}


ビルド実行結果


6



このときの自作関数newfunctionの定義は


前にでてきた自作関数functionの定義とちがい


void function (int x)の部分が


int newfunction (int x)となっています。


つまり


戻り値を格納する型が


intになっています



さらに


            return;から


          return y;に変化していますね。



以下の


🍓🍓自作関数newfunctionのプログラムと


🐤🐤前のタイプの自作関数functionのプログラムを


5分間、見比べながら観察してみましょう。



🍓🍓自作関数newfunctionのプログラム

👇

#include <iostream>


using namespace std;


int newfunction (int x){


int y;


y=x+5;


return y;}


int main(){


int a=newfunction (1);


cout<<a<<"\n";


return 0;


}


ビルド実行結果


6



🐤🐤前のタイプの自作関数functionのプログラム

👇

#include <iostream>


using namespace std;


void function(int a) {


cout <<a+5<<"\n";


return;


}


int main() {


function(1);


return 0;


}


ビルド実行結果


6


どうですか?


今の🍓🍓のプログラム内の自作関数newfunctionの定義では


先頭にvoidの代わりにintがついていますね。


なぜvoidの代わりにintがつくのかというと


C言語、C++言語では


  🍊数値データはかならず 何かの変数の型に格納されるというルールがあります🍊


数値を格納する型としてint,floatなどがありますね


整数の型intを自作関数の前に記述することにより


自作関数は「戻り値」


というものをうけとることができるようになります。


voidは何もデータを格納しない型なので(笑)


voidのままでは


「戻り値」を格納することができません。


では 戻り値とはなんでしょうか?


この🍓🍓のプログラム内の自作関数newfunctionを例にとると


y=x+5にx=1を代入することによって


得られた 


y=6が 


return y;によって戻される


戻り値となっています。


では  いったいどこに戻り値は戻されるのでしょうか?😊(笑)


  みなさん すみませ~ん 質問がつづいていきますね。


戻り値であるy


整数値データy=6は


return y;によって


newfunction(1)


に返されます。


つまり


newfunction(1)=6となるわけです。


前のタイプの自作関数functionの定義では

👇


void function(int a) {


cout <<a+5<<"\n";


return;


}

👆


自作関数newfunctionの定義のように


return y;と記述して 数値y=6を


newfunction(1)に戻す必要がなかったので


returnのあとに何も書かない


return ;


が記述されています。


そして

 

 🌞自作関数では何かの型を先頭に置くというルールにより🌞


形式的に


戻り値を格納しないことをあらわす

voidの型が記述してあったわけです。


以下では


もうちょっとだけ


自作関数newfunction内の変数yとnewfunction(1)の関係について


さらに詳しく考察を加えてみます。」


solarplexuss「こういうのすきだよねえ」


。。。。。。。。。。。。。。。。。。。。。。。。。。


ソーラー「自作関数newfunctionの定義の中の命令文


y=x+5;

x=1を代入してy=6としたとしても


実は


コンピューターはnewfunction(1)=6と認識しないんじゃないかな?」



solarplexuss 「なんでそう思うんです?」



ソーラー


「だって 


y=x+5;

x=1を代入してy=6としただけでは


yとnewfunction(1)自体は


なんの関係もないからね。


だからreturn y;を行い


数値データ6を格納したyをnewfunction(1)に代入し数値データ6をあたえる必要がある‥


もうちょっと このことを詳しく説明してみるよ


return y;によって戻り値6は


数値1を引数に与えられた自作関数newfunction(1)


に返されます


そのとき


自作関数newfunctionの定義は

👇

int newfunction (int x){

👆

int y;

y=x+5;

return y;

}

と記述されていたので


戻り値6は


int型の形式でメモリに格納されることになります


それはあたかも次のような状態なんじゃない?



int newfunction(1)=6;


それで


int newfunction(1)=6;



よ~く観察してみると


一見すると


まるでnewfunction(1)が変数で そこに


直接 数値データ6が代入されたかのようにみえますね。


単にint型の変数aに数値データ6を代入する


int a=6;



int newfunction(1)=6;


を比べてみても


aとnewfunction(1)の関係は


とてもよく似ていますね。




マックス 「ここにこだわるとは・・・


ソーラー なんか思慮深いじゃないか~~(^o^)/」


ソーラー 「ぼくが思うに


整数の型int型の変数ともいえるnewfunction(1)に


return y;で変数yを経由して数値6を返す


つまりは


整数の型int型の変数ともいえるnewfunction(1)に


newfunction(1)=yと


yを代入し


yがもっている数値データ6を


格納させているからこそ


newfunction(1)は数値データ6をもつようになるというわけです


ここにreturn y;


の意味があるというわけです


そのように


newfunction(1)に数値データ6が代入されると


新たに別に作製されたint型の変数aに


数値データ6を格納している変数ともいえるnewfunction(1)を代入する


int a=newfunction(1);


を実行して


変数aに数値データ6を格納することができるというわけです」


マックス 「int型の変数newfunction(1)に変数yを用いて数値6を格納したからこそか・・・


どっかで同じようなことをやった・・かな💦・・・たっくさん(´▽`*)・・・」



ソーラー


「つまり なんらかの変数に得られた数値データ6を格納保存させておかないと


別の変数aに


そのなんらかの変数を代入して数値データ6を変数aに格納することができない・・


ここで


そのなんらかの変数の役割をnewfunction(1)がになっているというわけ


なんだね


戻り値6が返されるので


newfunction(1)は数値データ6をあらわすのだけど


よ~く観察すると 変数の役割をになっているってわけだね・・・


それにしても このような


変数に変数を代入して数値を格納するということは


実にたくさんやったね。マックス」


マックス 「わはは おお、そうだ、そうだったああ


int y;

int a;

y=5;

a=y;


によりaは数値データ5の値を持つ


やったなあ(^^)


あのころがなつかしいんん


わはははは」


ソーラー「つまり、


このプログラムにおいても同じような構造がかくれているということになります



#include <iostream>


using namespace std;


int newfunction(int x) {


int y;


y = x + 5;


return y;

}


int main() {


int a = newfunction(1);


cout << a << "\n";


return 0;


}


このプログラムにおいても


さりげなく


return yの


yの変数宣言


int y; 


がおこなわれ


変数扱いのnewfunction(1)に 


6の値を持った変数yが戻り値として返されることにより


newmademethod(1)の持つ値は6となっているのですね


そして さらに


6の値を格納することになったnewfunction(1)が変数aに代入され


変数aは6の値をもつというわけです。」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る