関数


自作関数を使用する

これまでは、C言語の標準関数を使用してきました
printf()やscanf()などです
そして、実行されていたプログラムですら、もはや説明不要のmain()関数の一部でした

関数はmain()関数を見てのとうりステートメントの集合体です
事実上C言語の建築単位は関数といえます

よく使用するステートメントの集合体などを関数として使うことが可能です
これまでは、到底実用は考えられない小さなプログラムばかりを作ってきましたが
実用性の高いプログラムを作成するときは、当然関数を大量に扱います

関数は、戻り値と関数名と引数リストで構成されています

戻り値の型 関数名 (引数リスト) {
ステートメント...
}

これは、今までmain()関数を扱ってきたのでわかるはずです
main()関数は最初に実行される関数というだけで、他の関数も作成の方法は同じです
関数名は変数名のように自由に付けることができます
使えない文字、名前も変数同様です。予約語などは使えません

ただし、関数を使用するのに最も注意しなければいけないことがあります
関数は使用されるよりも前に定義しなければいけないということです
呼び出すときは、標準関数同様に 関数名(引数リスト) で関数を呼び出すことができます
#include <stdio.h>

void func() {
        printf("kitty on your lap");
}

int main() {
        func();
        return 0;
}
func()関数が今回自分で作った自作関数です
もしfunc()関数がmain()関数よりも後ろにあった場合
main()関数でfunc()関数を呼び出した時点では、まだ宣言されていないことになっています

このプログラムをコンパイルすると、場合によっては警告が出るかもしれません
Borland C++ Compiler 5.5では次のような警告が出ました

警告 W8065 test.c 8: プロトタイプ宣言のない関数 'func' の呼び出し(関数 main )

この警告については、次の章で詳しく説明します
べつに上のプログラムでも間違いではありません

func()関数がmain()関数内で呼び出されると、当然プログラムの制御はfunc()関数に移ります
func()関数は見てのとおり kitty on your lap と画面に出すだけです
一連の作業が終了すると、流れはmain()関数に戻ります
つまり、return 0 が実行されてプログラムは終了します

関数は、標準関数同様に何度も必要に応じて呼び出すことができます
もちろん自作関数の中に、さらにべつの自作関数を用いることもできます
#include <stdio.h>

void func2() {
        printf("your lap\n");
}

void func1() {
        printf("kitty on ");
        func2();
}

int main() {
        func1();
        printf("ご主人様関数\n");
        func1();

        return 0;
}
結果は次のようになります

kitty on your lap
ご主人様関数
kitty on your lap

main()関数でfunc1()関数が呼び出され kitty on までを出力します
改行せずにそのままfunc1()関数内でfunc2()関数が呼び出されます
func2()関数で your lap と表示されてfunc2()関数が終了します
func1()に制御が戻り、func1()関数もそこで終わりなので最終的にmain()関数まで復帰します

そしてprintf()関数で「ご主人様関数」と出力して、再びfunc1()関数を呼び出しています
何ら難しいことはありません
func1()とfunc2()の並び方に注目してください
func1()関数からfunc2()関数を呼び出しているので、func2()関数はfunc1()関数よりも前に定義されている必要があります



前のページへ戻る次のページへ