コース一覧
    C言語基礎 関数・配列編
    プロトタイプ宣言

    C言語基礎 関数・配列編

    C言語の関数と配列を学び、処理を分割してデータを扱うコースです。

    1
    関数
    01. 関数を定義する15分
    02. 引数と戻り値15分
    03. プロトタイプ宣言15分
    04. void関数15分
    05. 変数のスコープ15分
    06. つくる 関数に分割15分
    07. 第5章クイズ10分
    2
    配列と文字列
    01. 配列15分
    02. 配列とfor15分
    03. 集計15分
    04. 最高点と最低点15分
    05. 文字列(char配列)15分
    06. 文字列関数15分
    07. 文字列の入力15分
    08. つくる 配列で成績管理15分
    09. 第6章クイズ10分

    プロトタイプ宣言

    main を下に置くと壊れる

    ここまで、関数の定義は必ず main より上に書いてきました。しかし読み手の立場になると、プログラムの入口である main が一番下にあるのは読みにくいものです。main を先頭に置きたくなります。やってみましょう。

    c

    #include <stdio.h>
    
    int main(void) {
        printf("合計は%d点です\n", total_of(80, 90, 85));
        return 0;
    }
    
    int total_of(int a, int b, int c) {
        return a + b + c;
    }

    これをコンパイルすると、実行ファイルはできずにエラーが出ます。

    プレーンテキスト

    error: call to undeclared function 'total_of'

    宣言されていない関数 total_of を呼んでいる、という意味です。関数はちゃんと下に書いてあるのに、なぜでしょうか。

    コンパイラは上から1回だけ読む

    理由は、C のコンパイラがソースを 上から順に1回だけ 読んでいくからです。4行目の total_of(...) に来た時点では、コンパイラはまだ 8 行目を見ていません。そんな名前は聞いたことがない、という状態です。

    しかもコンパイラは、名前を知らないと呼び出しコードを作れません。引数として int を3つ渡すのか double を渡すのか、返ってくるのは int なのか double なのかが分からないと、機械語に落とせないためです。必要なのは処理の中身ではなく、名前と型の情報 だけです。

    プロトタイプ宣言

    そこで、中身は後回しにして型の情報だけを先に教えます。これが プロトタイプ宣言 です。

    c

    int total_of(int a, int b, int c);

    関数定義の1行目から波カッコを取り除き、代わりにセミコロンを付けた形です。中身がないので、これだけでは何も実行されません。「こういう名前で、こういう型の関数が、このソースのどこかにあります」とコンパイラに約束する行です。

    これを main より上に置けば、main を先頭に書けます。

    c

    #include <stdio.h>
    
    int total_of(int a, int b, int c);
    double average_of(int a, int b, int c);
    
    int main(void) {
        printf("合計は%d点です\n", total_of(80, 90, 85));
        return 0;
    }
    
    int total_of(int a, int b, int c) {
        return a + b + c;
    }
    
    double average_of(int a, int b, int c) {
        return (a + b + c) / 3.0;
    }

    宣言に書く引数の名前は省略でき、int total_of(int, int, int); でも通ります。ただ、読み手には名前があったほうが親切なので、定義と同じ名前を書いておくのが普通です。

    セミコロンの付け忘れ

    よくある事故は、宣言の末尾のセミコロンを忘れることです。すると次の行と地続きになって、コンパイラは関数定義が始まったと勘違いします。エラーの内容が原因の行とかけ離れるので、宣言をまとめて書いた直後にエラーが出たら、まずセミコロンを疑ってください。

    ちなみに #include <stdio.h> の正体も、printf や scanf のプロトタイプ宣言が並んだファイルです。第1章で書いていた1行は、この仕組みそのものだったわけです。

    要件

    1. total_of と average_of のプロトタイプ宣言を main より上に書く
    2. total_of と average_of の定義は main より下に書く
    3. scanf で3つの整数を読み込む
    4. 1行目に 合計は255点です の形で表示する
    5. 2行目に 平均は85.0点です の形で小数第1位まで表示する

    ヒント

    プロトタイプ宣言は定義の1行目から波カッコを取り、末尾にセミコロンを付けた形です

    average_of の戻り値の型は double です。宣言と定義で型を食い違わせないでください

    平均で切り捨てが起きないよう、割る数は 3.0 にします

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • void関数

      値を返さない関数を書けるようになります。

    • 変数のスコープ

      ローカル変数がどこまで見えるか説明できるようになります。

    • つくる 関数に分割

      計算と判定と表示をそれぞれ別の関数に分けられるようになります。

    • 第5章クイズ

      第5章の理解を確認します。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 関数処理に名前を付けて再利用できる単位
    • コンパイルソースをバイトコードへ変換する処理
    • 引数位置引数=順番で渡す。
    • 処理計算や代入を表す長方形
    • 関数定義def 関数名(引数): で定義する。
    main.c
    エディタを読み込んでいます

    メモ

    プロトタイプ宣言

    ⌘S で保存