関数
次のプログラムは,整数 m, n の最大公約数を求める関数 gcd を定義したものです。
#include <stdio.h>
/* プロトタイプ宣言 */
int gcd(int m, int n);
int main(void)
{
int ret = gcd(84, 35); /* gcd 関数を呼び出し */
printf("%d\n", ret); /* 出力: 7 */
return 0;
}
/* 関数の定義 */
int gcd(int m, int n)
{
int r;
while (n) {
r = m % n;
m = n;
n = r;
}
return m;
}
関数の定義
一般に,関数の定義は次のように書きます。
返却型 関数名(型1 引数1, 型2 引数2, ...)
{
変数の宣言
処理
return 返り値;
}
返却型を省略した場合,その関数の返却型は int とみなされます。
引数
引数を持つ関数の定義には,括弧 (...) の中に型と引数を組にして書きます。
引数を持たない関数の場合,関数の定義は hoge(void) と書き,呼び出しは hoge() と書きます。
関数の定義も hoge() と書くのは C++ の流儀です。
返り値と return 文
return 文は,関数の返り値を指定する文です。
return 文は複数書くことができ,処理が最初に return 文に到達した時点で関数が終了します。
返り値を持たない関数は,返却型を void と書きます。
return 文は書いても書かなくても構わないが,書くのであれば return; と書きます。
次のプログラムは,引数も返り値もない prthello 関数を定義したものです。
#include <stdio.h>
void prthello(void);
int main(void)
{
prthello(); /* 出力: hello */
return 0;
}
void prthello(void)
{
printf("hello\n");
}
プロトタイプ宣言
関数の定義を,関数の呼び出し箇所より前方に書かない場合,関数の返却型,関数名,引数リストだけをソースコードの冒頭にも書きます。
これはプロトタイプ宣言 (prototype declaration) と呼ばれ,コンパイラが型チェックを行うために必要です。
返却型 関数名(型1 引数1, 型2 引数2, ...);
プロトタイプ宣言では,各引数名は省略できます。
今回の int gcd(int m, int b); は int gcd(int, int); と書くこともできます。
ヘッダファイル
複数のソースファイルから成るプログラムでは,プロトタイプ宣言はヘッダファイルと呼ばれる別のファイルに書きます。
ヘッダファイルは .h という拡張子を持つテキストファイルで,関数のプロトタイプ宣言の他に,定数や構造体などの定義も書かれます。
ソースコード冒頭の #include
ヘッダファイル stdio.h には,printf や scanf といった標準入出力用の関数プロトタイプや,その他の定数などが書かれています。