引数と戻り値

値を渡せる関数

前回の show_line は、いつ呼んでも同じ線を出すだけの関数でした。ここからは、呼ぶたびに違う値を渡して、違う答えを返してもらいます。渡す値を 引数、返ってくる値を 戻り値 と呼びます。

3つの点数から合計を出す関数を書いてみます。

int total_of(int a, int b, int c) { return a + b + c; }

カッコの中に int a, int b, int c と並べたのが引数リストです。型と名前をセットで、変数の宣言と同じ形で書きます。int a, b, c のようにまとめて書くことはできません。引数はそれぞれに型が必要です。

呼び出すときは、同じ並び順で値を渡します。

int sum = total_of(80, 90, 70);

この瞬間、関数の中の a に 80、b に 90、c に 70 が入ります。並び順で対応するので、渡す順番を間違えると意味の違う計算になります。

return は値を持って戻る

return a + b + c; は「この式を計算して、その値を持って呼び出し元へ帰る」という命令です。関数の戻り値の型を int と書いてあるので、返す値も int でなければなりません。

大事なのは、return に来た時点で関数がそこで終わるという点です。return より下に書いた行は実行されません。分岐の中で return を書けば、条件によって途中で切り上げる関数も作れます。

平均を返す関数

平均は割り算なので、戻り値の型は double にします。

double average_of(int a, int b, int c) { return (a + b + c) / 3.0; }

第2章でやったとおり、(a + b + c) / 3 と書くと int どうしの割り算になって小数が切り捨てられます。割る数を 3.0 にすることで、小数のまま計算されます。戻り値の型を double にしただけでは中の計算は直りません。切り捨ては割り算の時点で起きているからです。

受け取る側も double で受けます。

double avg = average_of(80, 90, 70); printf("平均は%.1f点です\n", avg);

変数に入れずに printf("%.1f\n", average_of(80, 90, 70)); と直接書くこともできます。関数の呼び出しは、それ自体がひとつの値として扱えるからです。

引数は関数の中だけのコピー

呼び出し側の変数を関数に渡すと、その 値がコピーされて 引数に入ります。関数の中で a を書き換えても、呼んだ側の変数は変わりません。この性質は、あとの回で「関数の中から呼び出し元の変数を変えたい」となったときに効いてきます。今は、関数は値をもらって値を返すだけの箱だ、と思っておいてください。

では、合計と平均を返す2つの関数を書いてみましょう。

要件

  1. total_of という関数で3つの点数の合計を返す
  2. average_of という関数で3つの点数の平均を返す。戻り値の型は double
  3. scanf で3つの整数を読み込む
  4. 1行目に 合計は255点です の形で表示する
  5. 2行目に 平均は85.0点です の形で小数第1位まで表示する

入出力例

main("80 90 85") → "合計は255点です 平均は85.0点です" main(70, 75, 80) → "合計は225点です 平均は75.0点です" main("100 95 90") → "合計は285点です 平均は95.0点です"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

引数と戻り値

⌘S で保存