C11におけるプロトタイプ宣言について。
//fd1関数のプロトタイプ宣言
double fd1(double, double);
void main() {
double d1, d2, d3, d4[10];
double a = 1.2, b = 3.4, c = 2.7;
int i = 0;
d1 = fd1(a, b);
d2 = fd1(4.1, 5.7);
d3 = fd1(c, 2.8);
d4[0] = d1;
d4[1] = d2;
d4[2] = d3;
for (i; i < 3; i++) {
printf("d%d = %f\n", i, d4[i]);
}
}
//fd1関数の宣言
double fd1(double a, double b) {
double c = (a + b) / 2.0;
return c;
}
プロトタイプ宣言とは、関数等のプロシージャをソースコードの冒頭部分で宣言することです。
プロトタイプ宣言は、関数のプロトタイプとも呼ばれます。
通常の関数は、main関数よりも上の行で宣言します。
しかしこれだと、もし関数が10個とか20個とかあったら、本文の前に関数がずらりと並んでしまって、コードがとっても読みづらくなってしまうらしいです。
そこで出てくるのがプロトタイプ宣言です。
プロトタイプ宣言をmain関数の前にやっておくと、その関数の実際の宣言はmain関数の後ろに記述しても、コンピューターの処理上は何の問題もなくなります。
ちなみにプロシージャとは、プログラミングにおける複数の処理を1つにまとめたもののことです。
プロシージャには返り値は存在しません。
なので上記プログラムのプロトタイプ宣言の部分にも、当たり前ですが返り値は存在しません。
プロトタイプ宣言のほかの例について。
//プロトタイプ宣言
int p(int, int);
void p2(int);
void p3();
//実行
void main() {
int a = 8, b = 5;
p3();
p2(a);
p2(b);
printf("2つの数のうち大きいほうは%dです。\n", p(a, b));
p3();
}
//p関数
int p(int a, int b) {
if (a > b) {
return a;
}
else {
return b;
}
}
//p2関数
void p2(int a) {
printf("数値:%d\n", a);
return; //べつになくてもいい記述
}
//p3関数
void p3() {
printf("**********\n");
}
返り値がない関数にはvoidを宣言します。
じゃあなんで、上記プログラムのvoid宣言をしたp2関数の部分にreturnの記述があるのかですが、これはもう完全にプログラマさんの癖というか好みらしいです。
そもそもvoidは返り値がない宣言なので、その関数内にreturnを記述する意味はまったくありません。
しかしまあいつもの癖というか習慣というか、「なんかないと気持ち悪いよね」という感性をもったプログラマさんもいるらしいです。
そういう人たちは、void宣言をした関数にもreturnを書くことがあったりなかったりするようです。
実際のところ、あろうがなかろうがどっちでもいい記述ですからね。
しかしたとえvoid宣言をした関数であっても、その関数内でif文などを使っていてそのif文の中でその関数内で使う返り値があったりする場合にはreturnの記述は適宜必要です。
またもしif文などでその関数の処理から途中で抜け出したい場合などであっても、その位置でのreturnの記述は必須となります。
以上です。