【6日でできるC言語入門】関数を作る

 C言語のプログラムを書いていると、同じような計算や処理を何度も繰り返して書かなければならない場面に出会います。たとえば、複数の箇所で「2つの整数の最大値を求める」処理が必要な場合、毎回同じ計算式を書くのは非効率で、ミスも発生しやすくなります。
 そこで役立つのが「関数」です。関数は、よく使う処理に名前をつけ、必要なときに何度でも呼び出すことができる仕組みです。関数を使うことで、重複する処理や複雑な処理を1つにまとめて管理でき、プログラムの見通しが良くなり、再利用性も高まります。

 C言語では、標準で用意された関数(printfscanf など)だけでなく、自分でオリジナルの関数を作ることが可能です。ここでは、関数の基本的な仕組みから、自作関数の作成方法、さまざまなパターンの関数について、例を交えて詳しく解説します。

1.関数の基本

1.1. 関数とは何か

本格的なプログラム開発では、「同じ処理を何度も記述する」問題によく直面します。
たとえば、2つの整数の最大値を求めて表示する場合、次のようなプログラムになります。

サンプルプログラム1

プロジェクト/ファイル名: Lesson37_1/main.c

#include <stdio.h>

int main(void) {
    int x1 = 8, y1 = 12, max1;
    int x2 = 5, y2 = 3, max2;
    int x3 = 15, y3 = 20, max3;

    // 最大値をそれぞれ求める
    max1 = (x1 > y1) ? x1 : y1;
    max2 = (x2 > y2) ? x2 : y2;
    max3 = (x3 > y3) ? x3 : y3;

    printf("最大値1: %d, 最大値2: %d, 最大値3: %d\n", max1, max2, max3);
    return 0;
}

実行結果

最大値1: 12, 最大値2: 5, 最大値3: 20

このように、同じ比較処理を複数回書いているため、修正や再利用がしにくい状態です。

1.2. 関数で処理をまとめる

上記のような繰り返し処理は、関数としてまとめることでプログラムをスッキリ書くことができます。

サンプルプログラム2

プロジェクト/ファイル名: Lesson37_2/main.c

#include <stdio.h>

// 2つの整数の最大値を求める関数
int max(int a, int b) {
    if(a > b)
        return a;
    else
        return b;
}

int main(void) {
    int x1 = 8, y1 = 12, max1;
    int x2 = 5, y2 = 3, max2;
    int x3 = 15, y3 = 20, max3;

    // 関数を使って最大値を求める
    max1 = max(x1, y1);
    max2 = max(x2, y2);
    max3 = max(x3, y3);

    printf("最大値1: %d, 最大値2: %d, 最大値3: %d\n", max1, max2, max3);
    return 0;
}

実行結果

最大値1: 12, 最大値2: 5, 最大値3: 20

このように関数を使うと、同じ処理を何度でも簡単に呼び出せるようになります。

2.関数の仕組みと書き方

2.1. 関数の基本構文

関数は次のような書式で定義します。

項目内容
戻り値の型関数が返す値の型(例: int, double, void など)
関数名好きな名前をつける(ただし予約語や数字で始まる名前は不可)
引数関数に渡す値や変数の型と名前。カンマで区切って複数指定可能
処理内容関数の本体部分で、引数を使って計算や処理を行う
return文関数から値を返すときに使う。値を返さない場合はvoid型

例:2つの整数の合計を返す関数

int sum(int a, int b) {
    return a + b;
}

2.2. 引数と戻り値の役割

  • 引数 … 関数へ渡す値。複数指定できる。
  • 戻り値 … 関数の処理結果を呼び出し元に返す値。

サンプルプログラム3(合計値を計算)

プロジェクト/ファイル名: Lesson37_3/main.c

#include <stdio.h>

int sum(int x, int y) {
    return x + y;
}

int main(void) {
    int total = sum(7, 11);
    printf("合計値は %d です。\n", total);
    return 0;
}

実行結果

合計値は 18 です。

3.さまざまなパターンの関数

3.1. 引数なし・戻り値なしの関数

プロジェクト/ファイル名: Lesson37_4/main.c

#include <stdio.h>

void greet(void) {
    printf("こんにちは、C言語の世界へ!\n");
}

int main(void) {
    greet();
    return 0;
}

実行結果

こんにちは、C言語の世界へ!

3.2. 引数あり・戻り値なしの関数

プロジェクト/ファイル名: Lesson37_5/main.c

#include <stdio.h>

void show_square(int num) {
    printf("%d の2乗は %d です。\n", num, num * num);
}

int main(void) {
    show_square(5);
    return 0;
}

実行結果

5 の2乗は 25 です。

3.3. 引数なし・戻り値ありの関数

プロジェクト/ファイル名: Lesson37_6/main.c

#include <stdio.h>

int get_magic_number(void) {
    return 42;
}

int main(void) {
    int n = get_magic_number();
    printf("マジックナンバーは %d です。\n", n);
    return 0;
}

実行結果

マジックナンバーは 42 です。

まとめ

  • 関数は処理をまとめて再利用可能にする仕組みです。
  • 引数や戻り値の有無によって、さまざまなタイプの関数を作れます。
  • プログラムの見通しを良くし、保守性や再利用性が向上します。
  • 標準関数だけでなく、自作の関数も積極的に使いこなしましょう!