8.関数

8-1. 関数の型
8-2. 関数のしくみ
8-3. 再帰呼び出し

8-1. 関数の型

いよいよ今回からC言語のメインである関数に入ります。

そもそもC言語はmain関数に始まりmain関数の終了と共にプログラムが終了します。

いままでは、main関数のみでプログラムしていたのであまり関数の意識は無かったと思います。printfやscanfも関数ですが実態そのものを見たわけで無く関数の中身はブラックボックスのまま使っていたから単に特別な命令セットのような感覚だったと思います。

さて、これからはmain関数だけでなく他の関数も定義し利用していきます。
あまり難しく考えることもいりません。他の言語でプログラミングをやっていた人なら、main関数がメインルーチン、これから作る別の関数がサブルーチンと考えたほうが自然だと思います。
C言語がはじめての人も便利なものである事を実感していただければ幸いです。

ではまず、下のようなプログラムがあったとします。

#include<stdio.h>

int a,b,x;
a=5;
b=6;

main()
{
    x=a*a+b*b;
    printf("a^2+b^2=%d\n",x);
}

実行すれば、

a^2+b^2=61

と表示されます。つまりaの二乗+bの二乗=61をしめしています。

ここで、x=a*a+b*b を一つの関数として定義します。関数名はfunctionとします。

関数定義:
function()
{
x=a*a+b*b;
}

これでOKです。そしてメイン関数側ではfunction関数の呼び出しを行うので
x=a*a+b*b; の代わりに function(); とよいのです。
ただし、変数と同じで使用にあたって宣言が必要になりますのでグローバル領域でもメイン関数内でも結構ですからプロトタイプ宣言をしておいてください。

プロトタイプ宣言の例:void function();

#include<stdio.h>

void function(); /* プロトタイプ宣言 */
int a,b,x;
a=5;
b=6;

main()
{
    function();
    printf("a^2+b^2=%d\n",x);
}

function()
{
    x=a*a+b*b;
}

これで1つ関数を作る事ができました。

上記のソースコードを元に今回の話を進めるわけですが、まずは訂正版を以下に掲載します。

#include<stdio.h>

void function();   /* プロトタイプ宣言 */
int a=5, b=6, x;   /* 宣言時に初期化 */

main()
{
    function();    /* function関数の呼び出し */
    printf("a^2+b^2=%d\n",x);
}

void function()    /* プロトタイプ宣言と同じvoid型にする */
{
    x=a*a+b*b;
}

前回では、型を持たない関数(void)で宣言しました。

これは、関数の終了時に値を返さないことを意味します。
分かりやすく言えば関数内の処理だけおこなうサブルーチンとなります。

プログラムの流れは
1.main()が始まる
2.function()が呼び出され処理が移る
3.function()が終了しmain()に戻る
4.main()の終了
になります。

それでは型をもつ関数としてint型関数を紹介します。
さっきのプログラムをint型関数を用いて表すと。

#include<stdio.h>

int function();   /* プロトタイプ宣言でint型にする */
int a=5, b=6, x;   /* 宣言時に初期化 */

main()
{
    function();    /* function関数の呼び出し */
    printf("a^2+b^2=%d\n",x);
}

int function()    /* プロトタイプ宣言と同じint型にする */
{
    x=a*a+b*b;
    return 0;     /* functionの終了と戻り値 */
}

ここで return という新しいキーワードが出てきました。
このキーワードは関数から抜け出す(正確には呼出元の関数に戻る)働きがあります。そのとなりの0は関数を終了する時の戻り値の指定です。

void以外の関数では基本的に戻り値の指定が必要です。処理系によってはint型の場合、戻り値を省略すると成功(0)・失敗(-1)で返す場合があります。

その他、変数と同じようにfloat,double型があります。