🌞自作関数5 自作関数のプロトタイプ宣言をおこなってから自作関数の定義を行ってみます 




ソーラー

「さあ、次のプログラムを元気🌞にみていこう。」


太陽も燦燦と照っていますよ

👇


#include <stdio.h>


void f(int a);


int main(void){

f(8);

return 0;

}


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}


プログラムの実行結果


8回目のご飯はNouvel de まぐろです


ソーラー「


今まで見てきた自作関数はint main(void){}の前に


自作関数の定義がかかれていたけれども


このプログラムのような


自作関数の定義の記述の仕方もあります


この自作関数の定義の記述の仕方は


まず


int main(void){}の前に


さきに


自作関数の定義


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}


void f(int a)に(セミコロン);をくっつけた


void f(int a);


だけを 記述しておきます。


そして


int main(void){}の後に


自作関数の定義


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}


を記述します。


このように


main関数である


int main(void){}のまえに


void f(int a);を記述することを


自作関数のプロトタイプ宣言を行う


といいます。



自作関数の定義


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}

の仕組みをもう1度考察してみようかな。



void f(int a)のように


自作関数fの先頭に


自作関数fに戻り値を返す時の


戻り値を格納する型(この場合はvoid)を記述するのが


自作関数を作るときのルールとなっています。


(この場合は自作関数が実行されたとき自作関数に戻り値を格納させないのでvoid型を記述しています


voidは何も戻り値を格納しない型ともいえます)


戻り値を格納する型の右隣は 関数名を記述します。


(この場合は 関数名はfとなっていますが

f でなくても自作関数の名前は自由につけることができます )


関数名のお隣のかっこ()内には


自作関数内で使用される変数の変数宣言を記述します。


この場合は


整数値を格納する


変数aが


自作関数内で使用されています。


ですので


aの変数宣言


int aを


関数名fのお隣のかっこ()内に


記述します。


あとは


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}

のように


void f(int a){}のブロック{}内に


自作関数にしたい命令文



printf("%d回目のご飯はNouvel de まぐろです\n",a);



を記述して


自作関数fの完成です


自作関数の定義の仕方はこんなのだったよね。。




おおっと


そうそう


今のお話は


int main(void){}のまえに


void f(int a);


を記述して


プロトタイプ宣言をおこなったあと


int main(void){}の後ろに


自作関数の定義

void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}

を記述するというものだったね。



では


今までのように


int main(void){}の前に


自作関数の定義を


記述するタイプと


int main(void){}の後ろに


自作関数の定義を記述するタイプ 


を見比べてみましょう。


自作関数の定義をint main(void){}の前に記述するタイプはどうだったかというと

👇

#include <stdio.h>


void f(int a){

printf("%d回目のご飯はNouvel de まぐろです\n",a);

}


int main(void){

f(8);

return 0;

}


プログラムの実行結果


8回目のご飯はNouvel de まぐろです


👆のようになっています。


プロトタイプ宣言

void f(int a);



int main(void){}の前につくかつかないか


自作関数の定義が


int main(void){}の後につくかつかないか



違いで


main関数内は全く同じプログラムですね。


自作関数の定義をint main(void){}の前に記述しても


自作関数のプロトタイプ宣言をおこなって


自作関数の定義をint main(void){}の後ろに記述しても


自作関数をmain関数内で呼び出して使用するときは


f(8);


で一緒だね。ア~レ~サ~。」


アレサ「そうですね。」


ソーラー 「ではもうひとつ


自作関数のプロトタイプ宣言をしている


プログラムをみていきましょう。」


#include <stdio.h>


void f(void);


int main(void){

f();

return 0;

}


void f(void){

printf("ご飯はNouvel de まぐろです\n");

}


プログラムの実行結果


ご飯はNouvel de まぐろです



ソーラー「


このプログラムの場合でも


自作関数のプロトタイプ宣言は


void f(void);



main関数の前に記述されており


自作関数fの定義


void f(void){

printf("ご飯はNouvel de まぐろです\n");

}


のvoid f(void)の部分がプロトタイプ宣言の記述に用いられています。



自作関数fの定義は


main関数である


int main(void){

f();

return 0;

}

の後に


void f(void){

printf("ご飯はNouvel de まぐろです\n");

}


と記述されることになるね。


自作関数fの定義内では変数を使用していないので


引数部分に変数宣言を設定して


データを代入する必要はないため


プロトタイプ宣言


void f(void);


のf()の中にはvoidが記述されます。


そして


このような


変数を使用していない自作関数を


main関数内でよびだして使用するときは


戻り値の型voidと引数の部分のvoidを省いた


f();


を記述します。


f(void);


と記述するとコンパイルエラーになります。」



アレサ 「あっそうですね。


自作関数fの定義内の命令文


printf("ご飯はNouvel de まぐろです\n");


には


引数として数値を受け取る変数がつかわれていないですね。」


ソーラー

「そうなんです。


数値を受け取る変数がつかわれていないので


f()の()の中に引数として


数値を受け取る変数の変数宣言が記述されていないんです


つまり


自作関数fは数値を受け取ったりすることはないというわけで


自作関数fの定義では


void f(void)と()の中がvoid(数値を受け取らない、数値を格納しない型)


になるのでしたね。


このタイプの自作関数をmain関数内でよびだして使用するときは


f(void);でなくf();と記述する・・・ 


ここがポイントかな?


それにしてもラッキー


新しい自作関数の定義置き場 み~つけたっと


メイン関数 int main (void){}の外側の領域は


まるで自作関数置き場みたいだね。


int main (void){}の前も


int main (void){}の後も


自作関数置き場ってわけか


とにかく


これで大量に自作関数がおけるぞぉぉ」


大規模自作関数プランテーション構想に想いを馳せる。


アレサ 「ソーラーさん 


そうですね


また いろいろな お料理表示自作関数をつくって設置できますね。」




🌞今日もおまけのコーナーです🌞


先ほどのプログラムは

👇

#include <stdio.h>


void f(void);


int main(void){

f();

return 0;

}


void f(void){

printf("ご飯はNouvel de まぐろです\n");

}


プログラムの実行結果


ご飯はNouvel de まぐろです


このように書き換えることができます

👇


#include <stdio.h>


void f();


int main(void) {

f();

return 0;

}


void f() {

printf("ご飯はNouvel de まぐろです\n");

}


プログラムの実行結果


ご飯はNouvel de まぐろです




つまり


自作関数fの定義を


void f(void){

printf("ご飯はNouvel de まぐろです\n");

}


から


void f() {

printf("ご飯はNouvel de まぐろです\n");

}


のように


記述することができます


そうなると


自作関数fのプロトタイプ宣言は


void f(void);


から


void f();


に変化することになります


自作関数fを実行する場合は


f();


を記述することになります


実は


void f(void);


のままでもかまいません


また次のように

👇


#include <stdio.h>


void f();


int main(void) {

f();

return 0;

}


void f(void) {

printf("ご飯はNouvel de まぐろです\n");

}


👆


自作関数fの定義が


void f(void) {

printf("ご飯はNouvel de まぐろです\n");

}



自作関数のプロトタイプ宣言が


void f();


でも構いません


()のなかは空白でもvoidでも構わないのですね


ですが


次のようなプログラムを実行するとビルドエラーが表示されることになります


👇


#include <stdio.h>


void f();


int main(void) {

f(void);//👈ここに注目

return 0;

}


void f(void) {

printf("ご飯はNouvel de まぐろです\n");

}



👆


このように


自作関数fを実行する際は


f(void);



()の中にvoidを記述すると


ビルドエラーが表示されることになります


自作関数fを実行する際は


f();


と記述することになります












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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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