引数と戻り値
値を渡せる関数
前回の 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つの関数を書いてみましょう。
要件
- total_of という関数で3つの点数の合計を返す
- average_of という関数で3つの点数の平均を返す。戻り値の型は double
- scanf で3つの整数を読み込む
- 1行目に 合計は255点です の形で表示する
- 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点です"