
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 です。
プログラムを起動すると、
- OS がプログラムを起動する
- OS が main 関数を呼び出す
- main 関数が処理を行う
- 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言語の理解は一段深まります。
