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

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


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


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


これで大漁のデーターを


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


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


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


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


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


int x,int y、int z, 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関数の定義のなかの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);は


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


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


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

_______________________



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


おnew自作関数


int newfunction (int x){

int y;

y=x+5;

return y;}


を定義します。


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


newfunction関数の定義を


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


前に持ってきます。


🍓🍓

#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);

printf("%d",a);

return 0;

}

コンパイル結果

6


🐤🐤のプログラム

#include <stdio.h>


void function(int x){

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

return;

}


int main(void){

function(1);

return 0;

}

コンパイル結果

6




どうですか?






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


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


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


このC言語では


 


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




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


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


「戻り値」


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


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


voidのままでは


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




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


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


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自作関数のように


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


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


returnのあとに何も書かない


return ;


となっています。


そして



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



形式的に


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






以下では


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


教養を深めるため


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


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


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


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


ソーラー「お new関数の定義の中の式


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のデータは格納されています。


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

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)に


newfunction (1)=yを代入し


yがもっている数値6を


格納させているからこそ


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

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


さらに


新たに別の変数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となっているんじゃないかな?


そして さらに


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


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






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

作者を応援しよう!

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

応援したユーザー

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