>> 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言語入門トップに戻る
●更新履歴
2016/08/16 Java入門ページにページを幾つか追加
2016/04/08 Java入門ページ作成
2016/03/09 メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。
2016/03/09 PDOトランザクション、自動コミットモードをオフ追加
2016/03/09 PDO 例外処理 try catch追加
2016/03/09 PDO update文実行追加
2016/03/09 PDO delete文実行追加
2016/03/09 PDO insert文実行追加
2016/03/09 PDO selectでデータを取得、fetchAll、queryメソッド追加
2016/03/09 PDO bindValueとbindParamの違い追加
2016/03/09 PDO prepare プリペアドステートメントの使い方追加
2016/03/04 ソースコードをクリップボードにコピーする機能を追加
2016/03/04 C言語、C++のページのソースコードを一部修正
2014/01/31 C言語関数一覧ページに11ページほど追加
2014/01/31 C言語関数一覧ページに30ページほど追加
2014/01/30 C言語関数一覧ページ作成中
2013/07/01 レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。
2013/07/01 MySQL入門ページ作成
2013/07/01 PHP入門ページにSQLite学習項目追加
2013/06/25 ドメイン変更、レイアウトを一部変更
2013/03/14 レイアウトを一部変更
2012/08/13 C言語よくある課題・宿題ページ開設!
2012/08/13 シューティングゲーム作成第33章追加!
2012/08/11 ドメイン変更&サーバ移設完了
2012/04/21 シューティングゲームプログラミング第2,3章の内容を修正
2012/04/19 シューティングゲームプログラミング第2章の内容を修正
2012/04/03 Googleカスタム検索を設置!
2012/04/03 シューティングゲームプログラミング第32章追加!
2012/04/03 シューティングゲームプログラミング第31章追加!
2012/03/31 サイトをリニューアルしました!
2012/03/25 シューティングゲームプログラミング第30章追加!
2012/03/19 シューティングゲームプログラミング第29章追加!
2012/03/16 シューティングゲームプログラミング第28章追加!
2012/02/27 シューティングゲームプログラミング第27章追加!
2012/02/03 シューティングゲームプログラミング第26章追加!
2012/01/31 シューティングゲームプログラミング第25章追加!
2012/01/20 シューティングゲームプログラミング第23,24章追加!
2012/01/11 シューティングゲームプログラミング第22章追加!
2012/01/05 トップページ、ゲームプログラミング関連のトップページのデザインを変更
2012/01/04 シューティングゲームプログラミング第21章追加!
2012/01/01 シューティングゲームプログラミング第20章追加!
2011/12/25 シューティングゲームプログラミング第19章追加!
2011/12/22 シューティングゲームプログラミング第18章追加!
2011/12/18 シューティングゲームプログラミング第17章追加!
2011/12/17 シューティングゲームプログラミングページOPEN!
2011/11/21 ゲームプログラミングページOPEN!
2011/11/21 サイトデザインを大幅に変更
2011/11/17 TOPページのデザインを変更。相互リンクページに、複数サイト追加。
2011/11/06 WINAPI学習ページ(33~36章)追加
2011/11/05 WINAPI学習ページ(20~32章)追加
2011/10/27 WINAPI学習ページ(14~19章)追加
2011/10/21 WINAPI学習ページ(13章)追加
2011/10/21 サイトマップ、連絡ページ追加
2011/10/17 WINAPI学習ページ(6~11章)追加
2011/10/16 WINAPI学習ページ(1~5章)追加
2011/10/13 全体のレイアウト変更
2011/10/07 PHP学習ページ(8~11章)追加
2011/10/06 PHP学習ページ(1~7章)作成
2011/10/06 JavaScriptリファレンスページ作成
2011/10/05 C言語学習ページ発展編(10~14章)追加
2011/10/04 C言語学習ページ発展編(1~9章)追加。
2011/10/03 HTML/CSSリファレンスのページ追加。(個々の詳細ページは作成中)
2011/09/30 HTML学習ページ(8章)追加
2011/09/29 JavaScript学習ページ(12~17章)追加
2011/09/28 JavaScript学習ページ(1~11章)追加
2011/09/27 HTML学習ページ(4~7章)追加
2011/09/26 C言語学習ページ(27章)追加、C++学習ページ(17章)、HTML学習ページ(1~3章)追加
2011/09/25 C言語学習ページ(23~26章)を追加
2011/09/24 C++学習ページ(9~16章)追加
2011/09/23 C++学習ページ(3~8章)追加
2011/09/22 C言語の学習ページ(22章)とC++学習ページ(1~2章)追加
2011/09/21 C言語の学習ページ(15章~21章)を追加
2011/09/20 C言語の学習ページ(10章~14章)を追加
2011/09/19 サイト作成(随時更新予定)