関数とは

ある規模以上のプログラムを main()だけで作成すると、ステップ数の多い理解しにくいプログラムができあがってしまいます。
ですから、プログラムはいくつかの関数に分けて作成する方が、コンパクトで理解しやすいものとなります。
また、同じような処理を複数の個所で行っている場合、関数としてその処理をまとめてしまうと全体のステップ数も減ることになります。

・ユーザ関数のプロトタイプ宣言を main() よりも前に記述する。この宣言は、コンパイラに関数の情報を与える。この宣言を行うとコンパイラは関数の引数と返却値のチェックを行う。
・main()の中(ユーザ関数の中でもよい)で、ユーザ関数を呼ぶ。
・main()に続けてユーザ関数の本体部を記述する。




#include< stdio.h >
/* これはいつものメイン関数。これも関数です */
main()
{

  int plus(int,int);
  void text(void);

int a, b;
a = 5;
b = 2;

printf("5 + 2 = %d\n", plus(a, b));

text();

}

/* 足し算をする関数plus() */

int plus(int a, int b)
{

  return(a+b);  /* aとbをもらって、その和を返す */

}

/* 返値も引数もない関数 */
void text(void)
{

  printf("関数text()から呼び出されたコメント。\n");

  return();

}




引数

関数には情報を与えなければならない。この情報を引数と言う。


printf("%d\n",a);         /* 引数は、"%d\n" と a */
printf("%d %f %c \n", i, r, c);  /* 引数は、"%d %f %c \n" と i と r と c */
scanf("%c",&c);          /* 引数は、"%c" と &c */


この例のように printf や scanf は、少し特殊な例で、引数の数が変化しても良いようになっている。
このような引数の数が変化しても良いような関数を自分で作成するのは、いささか面倒な手続きが必要である。通常は、引数の数は決まっていると考えて良い。
まったく引数の無い関数があっても構わないが、その場合でも丸括弧で囲まなければならない。



  text(); /* 引数がない例 */



返り値

また、scanf で学んだように、関数には返り値がある。
この返り値を用いて、その関数で行った仕事の結果を知ることが出来る。
勿論、返り値のない関数もあるし、返り値を知る必要の無い場合は、利用しなくても良い。
引数も返り値も共に、型がある(例えば整数型を引数に、返り値は実数型とか)点に注意しよう。


関数の返り値の例


int c;
c = printf("abcd\n");
printf("number of character is %d\n", c);

今まで printf 関数の返り値があることや、その使い方については学んでこなかったが、実は、printf 関数には返り値があり、出力した文字の数が整数で返るようになっている。(改行 \n は数えられない)
従って、この例を実行すると、abcd と出力改行後、number of character is 4 と出力される。
勿論、今まで学んだように、返り値を利用しなくても良い。