>> C言語入門トップに戻る

関数について

今日は関数について説明します。

今までは、main関数の中だけに処理を書いていましたが、
これでは非常に見にくいです。
同じ事をする計算処理などは、短くかいて処理できたほうがいいですよね?
そのためにC言語では、自分で関数を作ることができます。
次のコードを見てください。

#include <stdio.h>

int calc(int test){

	int temp;

	temp=test*5;

	return temp;
}

int main(void){
	
	int number=0;

	number=calc(10);

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

	return 0;
}


これを実行すると「50」と表示されます。
ではコードの解説をします。

int calc(int test)

というのが関数です。
これをどういうものか説明すると

戻り値の型 関数名(引数の型 仮引数名)

という構造になっています。

まず戻り値の型についてですが、
関数というのは処理した結果を呼び出し元に返すことが出来るのですが、
その値の型が何かを決めるものです。
今回はint型なので、int型の戻り値を返すという意味です。
基本的変数を宣言したときと同じ型が使えますが、
何も値を返さないという意味のvoid型も使えます。
ですので、何も値を返さず処理だけ行いたいときはvoid型を使って下さい。

関数名に関しては、自分の好きな名前の関数名を書いていいです。
ルールは変数名の時と同じです。
ですが、予約語というものがあります。
これはC言語であらかじめ用意されている関数(printf,scanf)等のことで、
これと名前が一緒のものはつけることができません。

次に引数の型ですが、
これは関数を呼び出すときに、値を渡せるのですが、
その値の型のことを表しています。
今回はint型を渡すので、int型になっています。

最後の仮引数名は、その渡された引数の変数名のことです。
この関数内でしか使われない仮の変数なので、仮引数と呼ばれています。

さらにコードを見ると、計算した後に、returnを使って、
値を返しています。
この値が、呼び出し元で受け取る戻り値のことです。
当然最初で戻り値の型を定義しましたが、その型と同じ型の値を返さなければなりません。
返さないとコンパイルエラーになります。

これでcalc関数が出来上がりましたので、後は呼び出すだけです。
使い方はprintf関数などと同じ方法で大丈夫です。

関数名(引数)

でいいです。
引数はちゃんと定義した型の引数を渡してくださいね。

今回はint型の引数を指定したのに、数字の10、つまりint型の値を渡しています。
そして、その関数の戻り値をnumber変数で受け取っています。
つまり、

calc関数に10を渡す

calc関数で計算処理が行われ、50という値が返される

number変数でそれを受け取る

という流れになっています。
そして、それを最後にprintfで表示しているだけです。
別に変数で受け取らなくても、直接printf上で関数を実行することもできます。

printf("%d",calc(10))
このような実行方法も可能です。
この場合、先にcalc関数が実行されてから、printf関数が実行されます。
表示される結果は先程と同じです。

関数の作り方、実行方法についての説明は以上ですが、
宣言の仕方について一つ言っておくことがあります。

C言語というのは、順番にコードの上からコンパイルされていきます
自分がコンパイラだと思って考えてみてください。
先程のcalc関数は、
main関数より上に書かれていました。
つまり、自分はmain関数が実行されるよりも先に、calc関数の存在を知ることが出来るわけです。
ですので、main関数で問題なくcalc関数が呼び出せました。
ですが、もしmain関数より下に、calc関数を書いていたらどうなっていたでしょう。
その場合は、main関数が実行される段階では、
calc関数のコンパイルが終わってないことになるので、そんな関数はないと認識されてコンパイルエラーが出ます。

じゃあ、必ずmain関数より上に関数を書かなければならないのか?と思うかもしれませんが、
ちゃんと方法はあります。
プロトタイプ宣言というものを使えば防げます。
下記のコードを見てください。

#include <stdio.h>

int calc(int test);

int main(void){
	
	int number=0;

	number=calc(10);

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

	return 0;
}

int calc(int test){

	int temp;

	temp=test*5;

	return temp;
}



今度はcalc関数を下に書きましたが、これでもちゃんと実行されます。
では、そのプロトタイプ宣言というものですが、
main関数の前にある。

int calc(int test);

が、プロトタイプ宣言です。

この宣言は、
この関数がこのファイル内のどこかで定義されていますよということを、
コンパイラに教えてあげる為のものです。

書き方は、関数の{}内の処理は書かずに宣言部分だけ書きます。
最後には必ずセミコロンを忘れないでくださいね。
上記のコードでは、プロトタイプ宣言に、仮引数名も書いていますが、
プロトタイプ宣言であれば、引数の型だけでも結構です。

これをmain関数の上に書くことで、
コンパイルされる際に、コンパイラがこの関数がどこかに定義されているんだな、ってことを認識して、
コンパイルされるので、main関数より下にその関数の実体を書いていたとしても、
問題なく実行されるというわけです。

以上で関数の説明は終わりです。
わからないことがあれば気軽に聞いてください。
次回は、今までの知識を駆使して、サイコロを作ってみましょう。


>> 【サイコロを作ってみよう】に進む
>> C言語入門トップに戻る