C言語 関数とは?自作関数の作成方法を紹介

プログラミング

 

突然ですが、仮に今「2つの値でどちらが大きいかを求める」機能を含むプログラムを作る必要があるとします。そのとき恐らく多くの人がif文を使ったコードをmain関数内に作るでしょう。しかし、もしその機能がmain関数内で何度も使用される機能だったらどうでしょうか。

 

必要な分だけいちいち同じようなコードを書きますか?出来なくはないですが、ちょっと面倒ですよね。今は簡単なコードだからそこまで意識しないで済んでいるかもしれませんが、もし何度も使うコードがとても複雑で長いものだったら、完成する全体のコードはそれは醜いものになるでしょう。それを防ぐことができるのが今回紹介する関数です。

 

今までもたくさんの関数が登場しました。出力をするprintf関数、入力をするscanf関数などです。これらは「printf」という文字を書けば、「文字を入力するために関数だ」とプログラム側が認識してくれます。このように関数とは、「ある名前を書けば特定の機能を呼び出してくれる」という大変便利なものなのです。以下では、具体的な関数の定義の仕方や実際に自作した簡単な関数を使ったプログラム例を見ていきます。

 

関数の定義の仕方【2通り】

 

関数は、いくつかの決まった事柄を決めることで宣言できます。この関数の宣言の仕方では、自作関数は必ずメイン関数の前に書かなければいけません

左から順番に説明します。

返却値型は、関数を呼び出すときになにかしらの結果を返してほしいときがあります。例えば、数字や文字といったものです。それらの関数から結果として返してもらう値のことを返却値と呼びます。返却値型には文字通りその返却値の型(int 、char、double)を書きます。

 

関数名は、その名の通り関数の名前のことです。名前は自由に決められます。例えば「合計値をもとめる関数」の関数名はわかりやすく「goukei」としてもいいですし、適当に「kansu01」としてもかまいません(関数名から関数の機能が分かる名前をお勧めします)。

 

仮引数(かりひきすう)とは、関数が呼び出されたときに他の関数から渡される値を受け取るための変数です。例えば、2つの値の合計を求める関数を使う場合、関数には合計するために使う2つの値を渡さなければいけません。そういったときに、渡される値を格納するのが仮引数で、( )内ではその仮引数の宣言をしなければいけません。例えば受け取る値が整数ならば「int a」などと宣言します。複数の仮引数を宣言するときは宣言同士をカンマで区切り、関数に値を渡す必要がないときは何も書きません

 

関数本体には、肝心な関数の機能をコードとして書きます。関数本体では、いつものmain関数と同じように好きな変数を宣言できるほか、先ほどの仮引数をそのまま変数として使うことが出来ます。しかし、ここで気を付けてほしいのが、「仮引数を含んだ特定の関数内で宣言した変数はそれ以外の関数では宣言したことになっていない」ということです。

 

これは、別の関数で宣言された変数は他ではもう使えないということではなく、関数内で宣言したものはその関数内でしか宣言したことにならないので、もし別の関数で同じ変数名を使う場合は再度宣言し直さなければい、と言うことを意味します。例えば、関数Aで宣言した変数名aを別の関数Bでも使いたい場合は、関数B内で再度宣言することになり、また、そうした場合は関数Aと関数Bにある変数aはまったく別の変数ということになります。

 

また、関数でなにかしらの数値を結果として返すと場合、return文を使って「return 返却値」と書くことで値を返却することが出来ます。例えば、2値の合計を求める関数を使用したとき、当然合計値を返してもらう必要があります。合計値を格納した変数をgoukeiとすると関数本体の最後に「return goukei」と書くことで、合計値が結果として返却されます。このとき気を付けてほしいのが、retrun文は関数の最後に使うということです。なぜなら、return文がプログラムで読み込まれると「その関数は終了した」と判断されて、そのあとのコードは実行されないからです。また、値を返す必要がない関数の場合、このreturn文は必要ありません。

 

またここまで聞いていると、実は同じような形をしたものを今までも見たことがあるのに気づきます。それはmain関数です。メイン関数とはC言語のプログラムにおいて一番最初に実行される大本の関数です。思い出せば、メイン関数の最後には「return 0;」という返却値のコードがありました。つまるところ、C言語において記述されるプログラムとは「たくさんの関数の組み合わせ」ということになります。

 

最後にもう一種類の関数の宣言方法を紹介します。

それは「関数の宣言だけしておいて、メイン関数の後で関数の中身を書く」というものです。通常は先ほどのようにメイン関数の前に関数を宣言、そして関数の機能を関数本体に記述します。しかしこの方法では、メイン関数の前に一度宣言だけしておくことでメイン関数でも使えるようにし、使用されたらメイン関数の後ろにある本体の情報を参照しに行くことになります。

上に例を書きました。先に関数情報を除いた関数の宣言だけしておくことで、プログラムに自作関数の存在を認知させます。メイン関数で自作関数が使用されたときは、メイン関数の下にある完全な関数宣言からその機能を引き出す仕組みです。関数の宣言方はどちらの方法を取ってもいいですが、関数が多くなるようであれば、メイン関数を一番上にした方がいいので、こちらの「先に簡単な宣言をしておく方法」を取った方がいいかもしれません、

 

関数の呼び出し方

 

関数の呼び出し方には決まりがあります。

 

関数名は、先ほどの「関数の宣言の仕方」でも紹介した関数名です。

 

実引数とは、仮引数に格納される値で、関数に値を渡すときにつかわれる変数です。例えば合計を求める関数(関数名goukei)に2つの値aとbを渡す場合、「goukei(a,b);」と書きます。仮引数と同じように、実引数も2つ以上の値を渡すときはそれぞれの値をカンマで区切ります。

 

以上が関数の一通りの解説です。とりあえず定義的な説明は書きましたが、やっぱり具体例で説明するのが一番なので、簡単な自作関数を使ったプログラを作成してみたいと思います。

自作関数を作ったプログラム例

 

今回作るプログラムは「2つの整数のうち最大値を表示する」というものです。なので、今回作るのは「2つの整数を比較して大きい方を返す」関数になります。それではまずは、関数の宣言からしていきます。

 

ここでは、2つの値を比較する関数なので関数名は「hikaku」としておきます。返却するのは、整数なのでint型で、使う値は2つだから仮引数は2つ必要です。ここでは簡単に x、yとします。すると、hikaku関数の宣言は以下のようになります。

しかし、これでは肝心の「2つの値を比較して大きい方を返す」という機能を満たしていません。なので、関数本体の{ }にif文を使い大きい方を返却するプログラムを書いていきます。完成したコードは以下のようになります。

この関数では、関数を呼び出されたときに渡された2つの値をxとyに格納して、その2値の大きさを比べて、大きい方をreturn文で返却するようなっています。このときrerturn文で関数が呼び出されたところに返された値が最大になります。

 

関数の呼び出しを考えます。基本的には先ほど書いたような呼び出し方で大丈夫ですが、今回は関数に返してもらう値を格納する変数が必要です。maxを宣言しておきましょう。ここにreturn文から返される値を格納します。

関数に渡す値(実引数)は大きさを比較する2値aとbです。2つ以上の実引数はカンマでくぎってください。

 

ということで、完成したコードは以下のようになります。

ここでは自作関数を一度しか使っていませんが、本来は何度も使いまわすために使います。また、一度しか使わない機能でもメイン関数に書くと、メイン関数自体が長く複雑で非常に見にくいものになるのを防ぐためにも分離する意味で使います。

コメント