5ルールの4つめ、関数
これまでは、プログラムはすべてmain()という場所に書いてきました。数十行の小さなプログラムであればこれで問題ないですが、プログラムが大きくなってくると、以下のような問題が出てきます。
- ひとかたまりになっていると読みにくい、メンテナンスしにくい
たとえば1万行が処理順に羅列されたプログラム…まず読めないと思います。
- 同じ、あるいは似た処理を複数箇所に記述するのは効率が悪い
同じ仕事を複数箇所に書くのは、読みにくくなる上にメモリの無駄でもあります。
そこでプログラムでは、ある仕事の単位をひとかたまりにして、必要なときにそれを呼び出すという方法を使います。これは一般的にはサブルーチンといいます。C言語では、このなにかしらの機能を持った処理のかたまりを、関数という名前で呼びます。C言語の関数は、以下のような形をしています。
戻り値の型 関数名(引数、引数、…) { 処理 }
引数
引数(ひきすう)は、その関数に与える値です。戻り値は、関数で処理された結果のことです。わかりにくいと思いますので、いきなり実例でいきましょうか。たとえば、2つの変数をもらって、その和を返す関数はリスト1のようになります。
int tashizan( int a, int b ) ① { int kotae ; ② kotae = a + b ; ③ return kotae; ④ }
まず1行目(①)から。最初のintは、変数の型で学んだのと同じです。「この関数の処理結果(計算結果)は、int型で返しますよ」という宣言です。tashizanは、この関数の名前です。名前はなんでもOKですが、その関数が何をするものかわかりやすい名前を付けるのが常道です。関数名のあとにはカッコで2つの変数宣言があります。これがこの関数への引数です。ここではint型で2つの値を受け取り、それぞれaとbという変数に代入することを意味します。
2行目(②)は普通の変数宣言です。この関数で使うための変数を宣言します。ここでは計算結果を入れるためのkotaeという変数を作ってみました。
3行目(③)はこの関数で行う処理です。ここでは単に足し算をしています。
4行目(④)は初めて見る命令が出てきました。return(リターン)文です。これは、この関数の戻り値を指定する命令です。つまり、3行目で得られた計算結果(が入っている変数kotae)を返しますということです。
関数の呼び出し
次に関数の使い方です。関数を使うことを、一般にはその関数を「呼び出す」という言い方をします。では、main()からtashizan()を呼び出す例をリスト2に示します。
void main() ① { int kotae; ② kotae = tashizan( 64, 18 ); ③ }
いきなり3行目(③)を見てください。これが関数の呼び出し方です。関数tashizan()は、引数2つですので2つ値を与えます。変数kotaeはtashizan()の処理結果を受け取るための変数です。3行目まで実行すると、kotaeには82が代入されるはずです。ぜひPM plus→SM+で確認してみてください。
引数は変数でもOK
ここでは引数に数値を書いていますが、引数はもちろん変数でもOKです。たとえばリスト3のようにします。
void main() { int a; int b; int kotae; a = 64; b = 18; kotae = tashizan( a, b ); }
ここで注意があります。main()ではa, b, kotaeという変数を宣言しています。一方で、関数tashizan()でも同じ名前の変数があります。kotaeという変数に計算結果が入るのなら、
void main() { int a; int b; int kotae; a = 64; b = 18; tashizan( a, b ); }
と書くだけで、main()の中の変数kotaeに計算結果が代入されるでしょうか。これもぜひSM+で確かめてみてください。
はい、main()の中のkotaeに値は入りませんね。同じ名前の変数でも、main()の中の変数とtashizan()の中の変数は別ものなのです。これはたとえば、ヒロシ君という子がいても、佐藤さんちのヒロシ君と鈴木さんちのヒロシ君は別人というのに似ています。
