C言語大漁捕獲 戻り値を格納する自作関数 


マックス 「はじめるぜ~~~大漁じゃ~~~わはははは」


ソーラー 「すごいです。近年まれにみるC言語大漁捕獲です。」


マックス「このint,int,int,int,int・・・・・の数をみろ ソーラー


これで大漁のデーターを


天国にいけるC言語入門にフィードバックできるぞ」


(そんなにint,int,int・・・・・・を


天国にいけるC言語入門にフィードバックしたら、


天国にいけるC言語入門が


野生の王国 intランドになっちゃいます。)


ソーラー 「そのとおりです。わはははは、


int x,int y、int z, int γ、int α・・・・・


こんなにintが・・・・


今日は このintをつかって「戻り値」を


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


マックス 「戻り値か・・・・・えとぴりか・・・」


ソーラー 「そうです。戻り値です。



いままでは自作関数 function(int x)のint xに


次のようにプログラムを記述し


#include <stdio.h>


void function(int x){

printf("%d\n",x);

return;

}


int main(void){

function(1);//🌞👈ここです

return 0;

}


数値1を代入していました.


この場合


プログラムの実行結果

1

になります。


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

void function(int x){

printf("%d\n",x);

return;

}

から

void function(int x){

printf("%d\n",2*x);

return;

}


に変更し、


できたプログラム

👇

#include <stdio.h>


void function(int x){

printf("%d\n",2*x);

return;

}


int main(void){

function(1);

return 0;

}


を実行すると


プログラムの実行結果は

2

になります。


つまり


function(1);


が実行されると


printf("%d\n",2);


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


自作関数functionの定義のなかの


printf("%d\n",2*x);



2*xを x+5にかえた


プログラムを実行してみようかな?」


🐤🐤

#include <stdio.h>


void function(int x){

printf("%d\n",x+5);

return;

}


int main(void){

function(1);

return 0;

}


プログラムの実行結果は


6


になります。


この場合は


function(1);


が実行されると


printf("%d\n",6);


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


このとき


自作関数


function(1);


の実行時


function(int x)


のint x に1を代入するわけですが


function(int x)



まるで


数学におけるy=f(x)💖💖のようなものにみえます


数学におけるf(x) との


違いは


function(int x)



function(1);


すなわち


printf("%d\n",6);


のように


コンピュータに命令をあたえる命令文ということなんです

_______________________



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


おnew自作関数


int newfunction (int x){

int y;

y=x+5;

return y;}


を定義します。


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


newfunction関数の定義を


int main(void)がはじまるより


つまり


main関数の前に


前に持ってきます。


🍓🍓

#include <stdio.h>


int newfunction (int x){

int y;

y=x+5;

return y;}


int main(void){

int a=newfunction (1);

printf("%d",a);

return 0;

}


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


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



        void newfunction (int x)の部分が


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



さらに


            return;の部分も



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




以下の

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


🐤🐤前のタイプのプログラムを


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




🍓🍓のプログラム

#include <stdio.h>


int newfunction (int x){

int y;

y=x+5;

return y;

}


int main(void){

int a=newfunction (1);//👈newfunction (1)には戻り値として6が返されます

printf("%d",a);

return 0;

}


プログラムの実行結果


6



🐤🐤のプログラム

#include <stdio.h>


void function(int x){

printf("%d\n",x+5);

return;

}


int main(void){

function(1);//👈function (1)には戻り値が返されません

return 0;

}


プログラムの実行結果


6




どうですか?






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


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


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


このC言語では


 


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




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


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


「戻り値」


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


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


voidのままでは


「戻り値」を自作関数がうけとることができません。(メモリに格納することができません)




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


この🍓🍓のプログラムのnew自作関数を例にとりましょう


int a=newfunction (1);



newfunction (1)


ご注目ください


newfunction (1)


が実行されると


自作関数newfunctionの定義

👇

int newfunction (int x){

int y;

y=x+5;

return y;}

👆

int xに1が代入されたものが実行されされることになります



つまり


int y;

y=x+5;

return y;


のxに1が代入されたものが実行されることになります


となると


yには6が代入されることになります


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


得られた 


y=6が 


return y;によって戻される


戻り値となっています。


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



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



戻り値である整数値y=6は


return y;によって自作関数newfunction (1)


に返されます。


つまり


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


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

👇

void function(int x){

printf("%d\n",x+5);

return;

}

👆

おnewな自作関数newfunctionのように


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


function (1)に戻すような必要がなかったので


returnのあとに何も書かない


return ;


が記述されています


つまり


function(1);


を実行しても


function(1)に


何も戻り値を戻す必要がないので


returnのあとに何も書かない


return ;


が記述されています



そして



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



形式的に


戻り値を格納しないことをあらわすvoidの型が記述してあったわけです。






以下では


そんなことするんかい  という感じですが


教養を深めるため


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


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


solarplexuss「こういうのすきなんだねぇ」


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


ソーラー「お new自作関数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;によって戻り値は


数値1を引数に与えられた自作関数newfunctionの先頭につけられた


intの型 の形式で数値6のデータはnewfunction (1)(newfunction (1)を管理しているメモリ)に格納されています。


それは次のような状態なんじゃない?

int newfunction (1)=6


それで


int newfunction (1)=6


を よ~く観察してみると


一見すると


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


《直接》数値6が代入されたかしたかのようにみえますね。


単に変数aに数値6を代入する

int a=6;

int newfunction (1)=6;

を比べてみても


aとnewfunction (1)の関係は とてもよく似ていますね。


が この場合 実はちょっとだけニュアンスが違うんじゃない


ってことがいいたいんだな😊」



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


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


ソーラー 「ぼくが思うに


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


return y;で《変数y》を経由して数値6を返す(渡す)


つまりは


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


yを代入する


newfunction (1)=y


がおこなわれて


yがもっている数値6を


newfunction (1)に渡しているからこそ


newfunction (1)は数値6ををもつようになり

(ようは 単に数値6を直接newfunction (1)に代入したわけじゃないってことだよ~ん  直接newfunction (1)に6を代入することはできません )


さらに


新たに別の変数aに 数値6を持った変数ともいえるnewfunction (1)を代入し


int a=newfunction (1);


変数aに数値6を格納することが可能になる、と思うんだ?」


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


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


ソーラー

「つまり なんらかの変数に


得られた数値6を格納保存させておかないと


別の変数aに


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


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


じゃないのかな?


一見すると newfunction (1)は戻り値が返されて


数値データになっているとみえたとしても


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


それにしても このような


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


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


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


int y;

int a;

y=5;

a=y;


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


やったなあ(^^)


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


わはははは」


ソーラー「つまり、


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

#include <stdio.h>


int newfunction (int x){

int y=x+5;

return y;}


int main(void){

int a=newfunction (1);

printf("%d",a);

return 0;

}


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


さりげなく


return yのyを成り立たせるための


変数宣言int y; (yを変数宣言)


がおこなわれ


変数扱いのnewfunction(1)に 


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


newfunction(1)は6の値をもつことになるんじゃないかな?


そして さらに


int a=newfunction (1);


の実行により


6の値をもったnewfunction(1)が変数aに代入され


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






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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