関数とは
C言語のソースコードの大部分は関数でできています。
意味は数学の関数と一緒で渡した値に1対1で対応した値を返す機構のことです。
プログラミングにおいては、値を返すほかによく使う一連の作業をまとめて何度も呼び出すために使われます。
y = f(x)
という関数があったときxを引数(ひきすう)、yを戻り値または返り値と呼びます。
ここでは戻り値で統一します。
関数の使い方
関数には引数と戻り値がそれぞれある場合とない場合があります。
引数がある場合
()の中に関数に渡す変数または値を入力します。
f(x);
引数がない場合
()の中に何も書かずに呼び出します。
f();
戻り値がある場合
呼び出し時に値が返ってくるので変数に代入する形で使います。
y = f(x);
条件式や関数の引数として使う場合もあります。
if(f(x) == 0){}
戻り値がない場合
値が返らないので変数に代入せずに使います。
f(x);
関数の定義の仕方
関数はこのように定義します。
【戻り値の型】 【関数名】(引数1, 引数2, …) { 【関数の定義】; return 【戻り値】; }
例えばint型の引数を一つ持ち、引数の2倍の値を返す関数f()は以下のようになります。
function_sample.c
int f(int a) { return 2 * a; }
関数の定義をソースコードのmain()関数より下に書く場合はmain()関数の前に
【戻り値の型】 【関数名】(引数1, 引数2, …);
と書きます。
これを関数のプロトタイプ宣言といいます。
コンパイラはソースコードを上から順に読んでいくので関数の定義もしくはプロトタイプ宣言がないとそれがどんな関数なのかわからずコンパイルエラーになります。
main()関数
さてこの関数の定義の仕方ですが、どこかで見たことはありませんか?
そうです。最初にかいたmain()も関数です。
「C言語でプログラムを書く」ということは、すなわち「main()関数を定義する」ということと等価です。
自身で定義したmain()関数を他のプログラムから呼び出すことでプログラムを実行しています。
再帰関数
関数の応用法を見てみましょう。
再帰関数とは、ある関数からその関数を呼び出すことです。
これはどういうことでしょうか。
ソースコードを見ながら解説していきます。
function_sample.c
#include <stdio.h> int fact(int n) { int m; if (n <= 0) return 1; else { m = fact(n - 1); return n * m; } } int main(void) { int i = 5; int a = fact(i); printf("%d\n", a); return 0; }
これは引数の階乗を求める関数です。
facr()関数の中でfact()関数を呼び出しているのがわかります。
呼び出す度に引数を減らしていき、0になったら再起呼び出しを終了しています。
再帰関数を用いることでよりソースコードを簡潔に書ける場合があります。
他にはマージソートなどが良い例です。