C言語

戻り値のある関数の使い方

前回「引数を使ってデータを渡す関数の使い方」に引き続き、関数の使い方です。前々回「プログラムの部品化ができる関数の仕組み」で、戻り値とは、関数から返される数値のことで、関数の呼び出し元に、関数の処理した結果を返したいときに指定することを学びましたが、具体的な使い方には触れていませんでした。今回は、戻り値のある関数の使い方について学びます。
戻り値は、関数から特定の値を関数の呼び出し元に返す値をいいます。

戻り値を使った関数を定義する

構文は、「プログラムの部品化ができる関数の仕組み」 で学びましたので、実際に戻り値の付いた関数を定義するところから学びます。

#include <stdio.h>

int twice( int );

int main(void)
{
    return 0;
}

int twice( int number )
{
    int result;

    printf("引数に2倍した値を返します\n");

    result= number * 2;

    return result;
}

10行目以降が関数定義です。
戻り値のみの関数も定義できるのですが、今回は、引数を付けたサンプルプログラムにしました。引数については、前回学んだため、ここでの解説は省略いたします。
関数定義の関数名の前のデータ型が戻り値の型になります。このサンプルプログラムでは、int型のデータを呼び出し元へ返すことを意味します。
そして、return文は、値を返すという機能があり、このreturn文で、呼び出し元に値を返します。サンプルプログラムでは、仮引数に、2を掛けた値を呼び出し元に返すことになります。
また、3行目のプロトタイプ宣言にも、戻り値の型を記述する必要があります。
前回、引数については、複数指定できることを学びましたが、戻り値は1つだけしか返すことができません。複数の値を返したい場合があると思いますが、これについては、ポインタの仕組みを学んだあとに解説します。

今までサンプルプログラムで記述してきた、main関数も戻り値のある関数になります。
main関数にも同様にreturn文がありますが、実は、これも、呼び出し元に0を返すということを行っていました。main関数の戻り値はどのような流れになっているかは、また、別の機会に解説したいと思います。

戻り値のある関数を呼び出す

次に、戻り値のある関数を呼び出すサンプルプログラムを記述します。

#include <stdio.h>

int twice( int );

int main(void)
{
    int ret;

    ret = twice( 2 );
    printf("結果は、%dです\n", ret);

    return 0;
}

int twice( int number )
{
    int result;

    printf("引数に2倍した値を返します\n");

    result= number * 2;

    return result;
}

9行目で、関数定義したtwiceを呼び出しています。そして、関数を実行した結果を ret変数に代入しています。必ずこのように代入する必要はありません。今まで通りの関数呼び出しでも問題ありませんが、その場合、戻り値は何も使用されないことになります。

次にサンプルプログラムの実行順について説明します。

  • main関数で、最初にtwice関数を実引数を2で呼び出します。
  • twice関数では、printf関数を実行し文字列を表示した後、仮引数のnumber * 2をresule変数に代入します。
  • 代入したresult変数の 4 をreturn文で呼び出し元に返して、twice関数を終了します。
  • main関数の9行目に戻り、戻ってきたときに、twice関数の箇所がreturn文のresultの値に代わります。ret = 4 ; になるイメージでよいと思います。
  • ret変数に4が代入されます。
  • printf関数にて、文字列と代入されたretの値が表示されます。
  • 最後にreturn 0が実行されてプログラムを終了します。

サンプルプログラムを実行した結果は次のようになります。

実行結果

引数に2倍した値を返します
結果は、4です

関数の呼び出し元では、変数に代入していましたが、次のようにまとめてしまっても結果は同じになります。

    printf("結果は、%dです\n", twice( 2 ));

この場合は、printf関数を実行する前に、twice関数を実行し、戻ってきた値が置き換わり、printf関数が実行するという流れになります。

以上が、戻り値のある関数の使い方についてでした。

次は、値が変化しない固定された値に名前を付ける方法である#defineについて学びます。

不変の値の扱い(#define)

-C言語