C言語入門|戻り値のしくみ

関数、だいぶ使いこなせるようになってきましたね。
引数を使えば、関数の動きを柔軟に変えられることも学びました。

でも、こんなことを思ったことはありませんか?

「関数の中で計算した結果を、
呼び出し元で使えたらもっと便利なのに……」

実はそれ、
戻り値 を使えばきれいに解決できます。

関数に仕事だけを任せたい場面

たとえば、次のようなケースです。

  • 関数には計算だけをお願いしたい。
  • 表示やその後の処理は呼び出し側で制御したい。

関数の中で
計算も表示も全部やってしまうと、
あとから使い回しにくくなってしまいます。

そんなときに登場するのが、
関数の戻り値 という考え方です。

戻り値とは何か

戻り値とは、
関数が処理を終えたあとに、呼び出し元へ返す値
のことです。

流れを整理すると、次のようになります。

手順処理の流れ
呼び出し元が関数を呼ぶ。
関数が内部で処理を行う。
処理結果を戻り値として返す。
呼び出し元がその値を受け取る。

つまり、
引数は「お願いするときに渡す情報」、
戻り値は「仕事が終わって返ってくる結果」
と考えるとわかりやすいですね。

戻り値を返す関数の基本形

戻り値を返す関数は、
次の形で定義します。

戻り値の型 関数名(仮引数リスト)
{
    処理内容
    return 戻り値;
}

ここで注目すべきポイントは2つあります。

注目点意味
戻り値の型どんな型の値を返すかを表明する。
return 文実際に返す値を指定する。

void と戻り値の違い

これまで使ってきた void は、

  • 戻り値がない。
  • 何も返さない。

ということを表していました。

一方で、
戻り値がある関数では、
int や double などの型を指定します。

指定意味
void戻り値なし
intint 型の値を1つ返す
doubledouble 型の値を1つ返す

関数定義の1行目は、
呼び出す側への重要な約束 なのです。

戻り値を使ったサンプル例

次は、
計算だけを行い、結果を呼び出し元に返す関数の例です。

表示内容は呼び出し側で行うようにしています。

プロジェクト名:8-9-1 ソースファイル名: sample8-9-1.c

#include <stdio.h>

int calcTotal(int base, int bonus)
{
    int total = base + bonus;
    return total;
}

int main(void)
{
    int score = 80;
    int result;

    result = calcTotal(score, 15);
    printf("合計点は %d 点です\n", result);

    return 0;
}

このプログラムの流れ

このコードでは、次のような流れで処理が進みます。

  1. main 関数が calcTotal を呼び出す。
  2. 引数として base と bonus が渡される。
  3. 関数内で合計値を計算する。
  4. return 文で合計値を返す。
  5. 呼び出し元で result として受け取る。

関数は
値を作って返す部品
として使われています。

戻り値は「関数の答え」

戻り値は、
関数が出した 最終的な答え です。

  • 計算結果
  • 判定結果
  • 状態を表す数値

など、
さまざまな用途で使われます。

このしくみを理解すると、
関数を「処理の箱」ではなく
「答えを返す部品」として設計できるようになります。

return 文の役割

return 文には、
次の2つの役割があります。

役割内容
処理の終了その場で関数の実行を終える。
値の返却呼び出し元に値を返す。

戻り値を持つ関数では、
必ず return 文で
指定した型の値を1つ返す必要があります。

戻り値がない関数の return

戻り値を持たない関数では、
return 文は省略できます。

void greet(void)
{
    printf("こんにちは\n");
}

あえて書く場合は、次の形になります。

return;

この場合、
値は返さず、処理だけを終了します。

まとめ:戻り値で役割分担ができる

戻り値を使うことで、

  • 関数は計算や判定に専念
  • 呼び出し元は表示や制御を担当

という、
きれいな役割分担 が可能になります。

この考え方は、
後に学ぶエラーコード設計や
複雑な処理の分割でも大活躍します。