トラック7・🧩関数とスコープ

引数と戻り値

読む目安 約12分・ゴール:引数で値を受け取り、returnで結果を返す関数を書ける

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

自動販売機を思い浮かべてください。お金を入れる(渡す)と、ジュースが出てくる(返る)。関数もこれと同じで、入口と出口を持てます。入口が引数、出口が戻り値です。

#include <stdio.h>

// 2つの整数を受け取り、その合計を返す
int add(int a, int b)
{
    return a + b;
}

int main(void)
{
    int x = add(2, 3);
    printf("%d\n", x);        // 5
    printf("%d\n", add(x, 10));  // 15
    return 0;
}

int add(int a, int b) の読み方はこうです。先頭の int が「この関数は int を返す」、カッコの中が「int をふたつ受け取り、関数の中では a と b という名前で使う」。呼び出し側の add(2, 3) の 2 と 3 を実引数、受け取る側の a と b を仮引数と呼びます。仮引数は関数の中だけで使える変数です。

return は2つの仕事を同時にします。値を返すことと、その場で関数を終わらせることです。return の後ろに書いた処理は絶対に実行されません。

引数は何個でも書ける

引数はカンマで区切って何個でも並べられます。ただし型は1つずつ書く決まりで、int add(int a, b) のような省略はできません。引数が増えるほど呼び出し側は順番を間違えやすくなるので、3〜4個までを目安にすると読みやすさを保てます。

戻せる値は1つだけ

return で返せる値は1つだけです。「商と余りを両方返したい」という場面では足りません。この不便さを解決する道具が第2部のポインタと第3部の構造体ですが、いまは「1つしか返せない」と覚えておけば十分です。

戻り値をその場で使う

戻り値は変数に入れてもよいし、上の例のように printf の引数にそのまま渡してもかまいません。関数呼び出しは、実行が終わると「その値そのもの」に化けると考えると読みやすくなります。

#include <stdio.h>

double circle_area(double r)
{
    return 3.14159 * r * r;
}

int main(void)
{
    printf("%.2f\n", circle_area(2.0));   // 12.57
    return 0;
}

罠・注意

ビット「何を渡して、何が返るか」を先に決めてから中身を書くと、迷わないよ

引数と戻り値がはっきりしている関数は、あとから別のプログラムに持っていってもそのまま動きます。部品として再利用できるかどうかは、この入口と出口の設計で決まります。

まとめ: 引数は入口、戻り値は出口。return は「値を返して、即終了」。この2つが決まれば、関数の設計はほぼ終わりです。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

2つの整数の合計を返す関数です。空欄に入るものを選んでください。

int add(int a, int b)
{
    ____ a + b;
}
  1. return
  2. print
  3. break
  4. exit
答えを見る

正解:A(return)

戻り値を呼び出し元に渡すのは return です。return は値を返すと同時に関数を終わらせます。break はループやswitchを抜けるもので、関数の戻り値とは無関係です。

確認問題 2

次のプログラムの出力はどれですか。

#include <stdio.h>

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

int main(void)
{
    int x = add(2, 3);
    printf("%d\n", add(x, 10));
    return 0;
}
  1. 5
  2. 15
  3. 10
  4. 23
答えを見る

正解:B(15)

add(2, 3) は 5 を返すので x は 5。次に add(5, 10) が呼ばれて 15 が返り、それが表示されます。関数呼び出しは「終わると戻り値そのものに化ける」と考えると読みやすくなります。

「関数とスコープ」の目次

  1. 関数とは——処理に名前を付ける
  2. 引数と戻り値
  3. プロトタイプ宣言
  4. 変数のスコープ——見える範囲
  5. 変数の寿命とstatic
  6. コールスタック——関数呼び出しの舞台裏
  7. 値渡しの本質
  8. グローバル変数との付き合い方
  9. 関数分割の設計センス
  10. 再帰の入口——自分を呼ぶ関数

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版