C言語のプログラムは、いくつもの関数を寄せ集めて、一つのプログラムとして作り上げていくことができます。
C言語には、あらかじめ便利な関数が用意されています。
例えば、文字をディスプレーに出力するprintf関数や、キーボードから文字列を入力する gets関数 などは、
C言語にあらかじめ用意されている関数のひとつです。
また、C言語では、標準で用意されている関数を使用するだけではなく、プログラマーが自由に関数を作ることもできます。
関数を作ることで、
・ プログラムの処理の流れが分かりやすくなる
・ 作成したプログラムの再利用が容易になる
・ プログラムの管理がしやすくなる
などのメリットが得られます。
そこで、今回のC言語超入門では、関数の作り方の基本について解説していきます。

関数の基本構成

C言語における関数の基本形は次のとおりです。

	関数型 関数名( 引数, …… ) {
		変数宣言;
		実行文;
	}

以下に、関数を構成している「関数型」「関数名」「引数」「変数宣言」「実行文」の5つについて、それぞれ解説していきます。

1. 関数型

関数型とは、関数内で処理をした結果を返すデータ型のことで、変数のデータ型と同じです。
例えば、倍精度実数型の関数型を定義するには、次のように記述します。

	double  関数名(引数, ……)

なおデータ型については「【C言語超入門(第14回)】基本的なデータ型を知ろう」で解説していますので、ご参照くださいませ。

2. 関数名

関数名は、他の関数や変数と重複しないよう、プログラム内でユニークな名前をつけます。
関数名をつけるときは、関数の持つ意味が分かるように命名しますと、後々のプログラムのメンテナンスが楽になります。
開発環境によっては、関数名の長さが31文字までという制限が設けられている場合もありますが、
大抵の開発環境においては、関数名は200文字以上で表すことができます。
ですから、関数を作るときは、関数名の長さを気にせず、できる限り分かりやすい命名をすることを、オススメします。

3. 引数

引数には、関数に値を渡すために、その値のデータ型と名前を記述します。
引数は、関数を呼び出す側、関数の定義側の双方で記述しなければする必要があります。
関数を呼び出す側の引数のことを「実引数」と言い、次のように記述します。

	y = fx_sample(x1, x2);
	y = fx_sample(123, 3.14);

上記のとおり、実引数は変数だけでなく、値を記述することもできます。
一方で、関数の定義側の引数は「仮引数」と言い、次のように記述します。

	fx_sample(int  i,  double  d)

仮引数で定義した変数は、その関数内でのみ、使用することができます。
なお、引数を必要としない関数の場合は、次のように、引数の記述を省略できます。

	fx_sample()

4. 変数宣言

変数宣言では、関数内で使用する変数を宣言します。
ここで宣言した変数は関数内だけで有効になる関数内ローカル変数です。
そのため、他の関数内で宣言している変数名と重複していても、お互いが独立した変数として扱われます。
例えば、関数を2つ作成して、双方に同名の変数名で変数宣言をした場合であっても、
お互いの変数は独立した別々の変数として扱われます。

5. 実行文

実行文には、その関数で処理をする目的となるプログラムを記述します。
関数という名前から、数値を計算する処理をイメージするかもしれませんが、
関数の実行文に記述する内容に特段の制限はありません。
例えば、文字をディスプレーに出力するだけの関数を作ることも可能です。

5-1. 関数の結果を返すreturn文

なお、関数の呼び出し元に実行文で得られた結果を返すには、return文を使います。
return文は、以下のとおり記述します。

	return 式;

式には、変数や値を記述します。
このとき注意していただきたいのは、式のデータ型は、「1. 関数型」の定義と一致させる必要がある、ということです。
関数型がdouble型であれば、return文の式もdouble型にします。
なお、式は括弧でくくることも可能です。

	return (式);

式を括弧でくくっても、くくらなくても、どちらでも動作しますので、あなたの好みで決めれば良いでしょう。
なお、プログラマーとして所属する組織や、参加するプロジェクトによっては、
記述ルールが定められている場合があります。
もし記述ルールが定められているときは、そのルールに従ってください。

5-2. return文は複数箇所で使用できる

return文は、ひとつの関数内で複数の箇所に記述することができます。
関数の処理を実行中にreturn文が実行された時点で処理が中断され、関数の呼び出し元に処理が移動します。
例えば、以下のプログラムでは、変数xの値がマイナスのときにreturn文を実行して関数の処理を中断しています。

	if ( x < 0 ) {
		return x;  /* 変数xの値がマイナスの時は処理を中断する */
	}
	/* 変数xの値が0以上のときは以降の処理を継続する */
		:
		:
	return x;

5-3. return文の式は省略できる

関数の呼び出し元に結果を返す必要がない場合は、以下のとおりreturn文の式は省略することができます。

	return;

C言語超入門の第31回まとめ

今回のC言語超入門では、関数の作り方の基本について解説いたしました。
関数を作らなくてもC言語のプログラミングは可能です。
でも関数を使うことで、プログラムの処理の流れが分かりやすくなる、作成したプログラムの再利用が容易になる、
プログラムの管理がしやすくなる、などのメリットを享受できます。
効果的・効率的なプログラミングができるよう、ぜひ関数の作り方をマスターしてください。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。