C言語入門(関数の作り方)

C言語

お疲れ様です。サンチョです!
今回は「自分で関数を作る方法」をご紹介します。

関数とは

ざっくり言うと、処理をひとまとまりにしたものが関数です。

printfやscanfのような、最初から用意されている関数もあれば、
mainのように自分で作成する関数もあります。

関数を作る目的

処理を部品として使い回せるようにするためです。

同じ処理を使いまわしたいとき、何度もコピペするのは疲れますし、
コピペを繰り返すと、main関数の中身とてもが長くなってしまいます。

関数に切り分けておけば、その関数を呼び出すだけで良いので手間も省けますし、
コードがスッキリして可読性(読みやすさ)も向上させることができます。

関数の作り方

関数の構成要素

関数は次の要素で定義されます。

  1. 戻り値のデータ型
    呼び出し元に送り返すデータの型です。
    ここで指定した方に合わせたデータをreturnしなくてはなりません。
  2. 関数名
    関数の名前です。尚、同じ名前の関数は定義できません。
  3. 引数(ひきすう)のデータ型
    その関数が呼び出し元から受け取るデータの型です。
    カンマ(,)で区切ることで複数の引数を定義することができます。
    引数を受け取らない場合は「()」だけ記述すればOKです。

上記の関数を言葉で説明するとしたら以下のようになります。
呼び出し元からint型の値を2つ受け取る
functionという名前の関数で
処理結果としてint型の値を呼び出し元に戻す

main関数に戻り値は必要ないの?
main関数もよく見ると「 int main() 」なので、本来は「return」が必要ですが
省略することができます。省略した場合は「return 0;」として扱われます。
この「0」は終了コードと呼ばれるもので、プログラムが正常終了したことを
OSに伝えるためにreturnされます。

コピペして学ぼう

では実際に関数を自作したサンプルをコピペして実行してみてください。
今回は「2つの数値を受け取って、足し算した結果を返す関数」を用意してみました。

#include<stdio.h>
int main() {
    int num1, num2, result;
    num1 = 10;
    num2 = 5;
    result = plus(num1, num2);
    printf("%d + %d = %d\n",num1, num2, result );
}

int plus(int i, int j) {
    return i + j;
}

プロトタイプ宣言

先ほどのサンプルをビルドした際に、次のメッセージが表示されたことに気づいたでしょうか?

コンパイラは上から順番にプログラムを読み込んでいきます。
main関数を読み込んだ時点で、コンパイラはplus関数の存在を認識できないため
int型の値を返す(returnする)外部関数がある」と言うことにしてしまうのです。

もし実際の関数の戻り値がint型じゃなかった場合は、その関数が呼び出された際に
コンパイラは「同じ名前の関数がもう1つ定義されようとしている」と判断して
ビルドエラーになります。

この問題は次のサンプルを実行すると実感できます。

#include<stdio.h>
int main() {
    int num1, num2;
    double result;
    num1 = 10;
    num2 = 5;
    result = division(num1, num2);
    printf("%d / %d = %f\n",num1, num2, result );
}

double division(int i, int j) {
    return (double)i / j;
}

一番手っ取り早い解決方法は、自作関数をmain関数より前に書いておくことですが
それだと自作関数を増やす際に、記述する順番を常に意識しなくてはなりません。
これはかなり大変で、混乱やバグの素なので避けたいところ…

そこで登場する便利な解決方法がプロトタイプ宣言です。
やり方はいたって簡単で、main関数の前に自作関数の形を宣言しておくだけでOK。
宣言だけなので、あとから関数が増えても順番を気にする必要もありません。

#include<stdio.h>

double division(int i, int j); // プロトタイプ宣言部分。セミコロン「;」をお忘れなく。

int main() {
    int num1, num2;
    double result;
    num1 = 10;
    num2 = 5;
    result = division(num1, num2);
    printf("%d / %d = %f\n",num1, num2, result );
}

double division(int i, int j) {
    return (double)i / j;
}

まとめ

今回は自作関数の作り方について触れました。
関数の作り方をざっくりまとめると以下のとおりです。
・mainは最初に呼び出される関数
・関数にすることで繰り返し記述する手間を省ける(処理の部品化)
・宣言する際は戻り値の型、関数名、引数の順番で記述する
・main関数の後に関数を書く場合はプロトタイプ宣言が必要

ここまで学べば、基本的なプログラミングはできると思うので、
次回は応用としてソートのアルゴリズムでも紹介してみようかな?

それが終わったらポインタや構造体の記事を書いていきます。

では、今日もお疲れ様でした!

コメント

タイトルとURLをコピーしました