C言語入門|標準関数と main の正体

関数の定義や呼び出しを学んでいると、ふとこんな疑問が湧いてきます。

「そういえば、printf や rand って、自分で作ってないのに使えてるよな?」
「もしかして、あれも全部“関数”なの?」

―はい、その気づきは大正解です。

実は、私たちは C言語を学び始めたその日から関数を使っていた のです。

C言語が最初から用意している関数たち

printf や rand、scanf などは、
文法的に特別な命令ではありません。

これらはすべて、

「誰かがあらかじめ定義してくれている関数」

です。

C言語では、プログラマがよく使う処理をあらかじめ用意しておき、
すぐに使えるようにしています。
これらをまとめて 標準関数 と呼びます。

関数名役割
printf画面に文字や数値を表示する。
rand乱数を生成する。
scanfキーボード入力を受け取る。

私たちは、これらの関数を
「定義せずに」「呼び出すだけ」で使ってきました。

これは、別の場所(標準ライブラリ)で
すでに関数が定義されているからです。

標準関数も“普通の関数”と同じ

ここがとても大事なポイントです。

printf も rand も、

  • 引数を受け取る。
  • 処理を行う。
  • 必要なら戻り値を返す。

という、これまで学んできた関数とまったく同じ仕組み で動いています。

つまり、

標準関数 ≠ 特別な命令
標準関数 = すでに用意されている関数

というわけです。

関数の正体が見えてくると、
C言語がぐっと身近に感じられてきます。

main 関数も特別扱いされていない

では、もう1つ気になる存在がありますよね。

そう、main 関数 です。

main 関数は、

  • プログラムの最初に実行される
  • 必ず1つ存在する

という特徴を持っていますが、
実はこれも 数ある関数のうちの1つ に過ぎません。

文法的には、ほかの関数と何も違いません。

項目main 関数その他の関数
定義方法同じ同じ
引数あり/なしあり/なし
戻り値int が基本任意
特別な点OSから最初に呼ばれる他の関数から呼ばれる

違うのは 呼び出し元 だけです。

main 関数を呼び出しているのは誰?

ここで、よくある疑問が登場します。

「main 関数の最後で書いてる return 0 って、誰に返してるんですか?」

答えはシンプルです。

main 関数を呼び出しているのは OS です。

プログラムを起動すると、

  1. OS がプログラムを起動する
  2. OS が main 関数を呼び出す
  3. main 関数が処理を行う
  4. return 文で値を OS に返す

という流れになります。

return 0 の正体:終了コード

main 関数が返す値は、
終了コード(exit code) と呼ばれます。

多くの OS(Windows、macOS、Linux など)では、
この終了コードを次のように扱います。

終了コード意味
0正常終了
0以外異常終了

つまり、

return 0;

は、

このプログラムは問題なく終わりましたよ

と OS に伝えている合図なのです。

関数の戻り値の知識があると、
main 関数の return も自然に理解できますね。

static を付けたローカル変数の正体

最後に、少しだけ発展的な話をしておきましょう。

通常、ローカル変数は
関数の実行が終わると消滅します。

ところが、変数の宣言に static を付けると挙動が変わります。

void countUp(void)
{
    static int count = 0;
    count++;
    printf("count = %d\n", count);
}

この場合、関数が何度呼ばれても
count の値は保持され続けます。

特徴内容
生存期間プログラム終了まで
見える範囲その関数の中だけ
性質グローバル変数に近い

便利に見える反面、

  • 状態が残る。
  • テストが難しい。
  • 不具合の原因になりやすい。

という点で、
グローバル変数と同じ注意が必要 です。

実務で使われる場面は、実はかなり少なめです。

まとめ:関数の世界はひとつにつながっている

ここまで見てきたように、

  • 標準関数も
  • main 関数も
  • 自分で作った関数も

すべて 同じルールで動く関数 です。

違うのは、

  • 誰が定義したか
  • 誰が呼び出しているか

それだけです。

この視点を持てるようになると、
C言語の理解は一段深まります。