C言語のきほん|変数の初期化と代入

変数は宣言しただけでは使わない。最初の値をきちんと入れる習慣が、C言語を安全にする。

ここまでで、変数はデータを入れる箱であり、使う前に型と名前を決めて宣言することを学びました。
でも、実は宣言しただけでは、まだ安心して使えません。

なぜかというと、宣言した直後の変数の中身は、何が入っているか分からない状態 だからです。
この状態を 不定値 と呼びます。

不定値のまま変数を使ってしまうと、たまたま正しく見えることもありますが、別の環境や別のタイミングではおかしな結果になることがあります。
こういう不安定なコードは、後で原因が分かりにくいトラブルにつながりやすいです。

そこで大切になるのが、次の2つです。

  • 初期化(宣言と同時に値を入れる)
  • 代入(宣言した後で値を入れる)

このパートでは、初期化と代入の違いをしっかり整理しながら、
「変数は使う前に必ず値を入れる」という、とても大切な習慣を身につけていきましょう。

宣言しただけの変数はなぜ危険なの?

まずは本文にあるポイントから見ていきます。

変数は宣言すると、メモリ上に箱が用意されます。
でも、その箱の中身は自動で 0 になるとは限りません(ローカル変数の場合)。

つまり、こんな状態です。

この「???」が不定値です。
前に使われていたメモリの内容がそのまま残っていたりして、予測できません。

サンプルプログラム: 不定値を確認する

ファイル名:4_3_1.c

// 不定値を確認するプログラム
#include <stdio.h>

int main(void)
{
    int score1;   // 宣言しただけで値を設定していない変数
    int score2;   // こちらも未初期化

    printf("変数の値を表示します。\n");
    printf("score1 の値は %d です。\n", score1);   // 不定値を表示
    printf("score2 の値は %d です。\n", score2);   // 不定値を表示

    return 0;
}

実行結果の見え方について(重要)

このプログラムは、実行環境や実行タイミングによって結果が変わります。
たとえば、ある環境では 0 や 8 のような値が見えることがありますが、それはたまたまです。

たとえばこう見えることがある(例)

変数の値を表示します。
score1 の値は 0 です。
score2 の値は 8 です。

でも、別のときにはまったく違う数値になることがあります。
ここで大事なのは、表示された値に意味はない ということです。

不定値を使ってはいけない理由

不定値の変数を使うと、プログラムの動作が予測できなくなります。

起こりやすい問題

  • 計算結果が毎回違う
  • 条件分岐が意図しない方向に進む
  • バグの原因が見つけにくい

学習中は「たまたま動いた」コードができることがありますが、
不定値が原因だと再現しづらくて、とても厄介です。

だからこそ、C言語では次の習慣が大切です。

変数は使う前に必ず値を入れる

代入とは何か

代入は、すでに宣言した変数に値を入れる操作です。

文法(代入)

変数名 = 値;

double pi;     // 変数の宣言
pi = 3.14159;  // 値の代入

この = は、数学の「等しい」とは少し意味が違います。
C言語では、右側の値を左側の変数に入れる、という意味です。

代入のイメージ

初期化とは何か

初期化は、変数を宣言すると同時に最初の値を入れる操作です。

文法(初期化)

型名 変数名 = 初期化子;

double pi = 3.14159;

これは、宣言と代入を1行でまとめて書いているイメージです。

初期化のイメージ

初期化と代入の違いを整理しよう

ここはとても大事なので、表で整理しておきます。

初期化と代入の違い(一覧)

項目初期化代入
タイミング宣言と同時宣言した後
目的最初の値を入れる値を更新・設定する
int x = 10;x = 10;

図でイメージ

どちらも最終的には変数に値を入れる操作ですが、
宣言と同時かどうか が違いです。

サンプルプログラム: 初期化と代入

ファイル名:4_3_2.c

// 変数の初期化と代入を行うプログラム
#include <stdio.h>

int main(void)
{
    int lesson_count = 3;   // 初期化
    int practice_count;     // 宣言だけ

    practice_count = 12;    // 代入

    printf("変数の値を表示します。\n");
    printf("lesson_count の値は %d です。\n", lesson_count);
    printf("practice_count の値は %d です。\n", practice_count);

    return 0;
}

実行結果例

変数の値を表示します。
lesson_count の値は 3 です。
practice_count の値は 12 です。

このプログラムでは、

  • lesson_count は宣言と同時に初期化
  • practice_count は宣言後に代入

という2つの書き方を同時に確認できます。

初期化をおすすめする理由

C言語では、宣言直後の不定値が危険なので、基本的には 初期化できるなら初期化する のがおすすめです。

初期化のメリット

  • 不定値を防げる
  • コードを読んだときに最初の値が分かる
  • バグが減る
  • デバッグしやすい

良い例

int count = 0;
double total = 0.0;
char grade = 'A';

最初から値が決まっているので安心です。

代入が必要になる場面もある

もちろん、いつも初期化だけで済むわけではありません。
あとから値が決まるときは、代入を使います。

代入がよく使われる場面

  • scanf で入力を受け取る前の変数
  • 計算結果を後から入れる
  • 条件によって値を変える

int score;
score = 80;

あるいは、あとで scanf を使うならこんな流れです。

int score;          // 先に宣言
scanf("%d", &score); // 実行時に値が入る

= は「等しい」ではなく「入れる」

ここは初心者が混乱しやすいポイントです。

C言語の = は数学の等式ではなく、代入演算子 です。
つまり、右辺の値を左辺に入れる、という意味です。

x = 10;

これは「x と 10 は等しい」ではなく、
「x に 10 を入れる」です。

この感覚に慣れると、C言語のコードが読みやすくなります。

変数は使用前に必ず値を設定しよう

このパートでいちばん大事なルールを、もう一度まとめます。

大事なルール

  • 宣言しただけの変数は不定値
  • 不定値のまま使わない
  • 初期化または代入してから使う

実践でのコツ

  • 最初の値が決まっているなら初期化
  • 後で決まるなら、使う前に必ず代入
  • printf で表示する前に値が入っているか確認する

よくあるミス(初心者あるある)

1) 宣言しただけで表示してしまう

int a;
printf("%d\n", a);   // 不定値で危険

2) 一部の変数だけ代入し忘れる

int a, b;
a = 10;
printf("%d %d\n", a, b);   // b は不定値

3) 代入と比較を混同する(今後の予告)

今後、条件分岐で == が出てきます。
そのときに = と混同しやすいので、今のうちに

  • = は代入
  • == は比較

という違いを意識しておくと良いです。

まとめて確認できるサンプル

初期化と代入をもう少しまとまった形で確認できる例です。

ファイル名:4_3_3.c

// 初期化と代入の違いを確認するプログラム
#include <stdio.h>

int main(void)
{
    int start_page = 1;      // 初期化
    int today_page;          // まだ値なし
    double study_time;       // まだ値なし

    today_page = 15;         // 代入
    study_time = 2.5;        // 代入

    printf("開始ページは %d です。\n", start_page);
    printf("今日は %d ページ進めます。\n", today_page);
    printf("学習時間は %.1f 時間です。\n", study_time);

    return 0;
}

実践問題

コメントを参考に空欄を埋めて、次のプログラムを完成させてください。

#include <stdio.h>

int main(void)
{
    // int型の変数dayとpageを宣言し、dayには5、pageには18で初期化する
    ➀ ;
    ➁ ;
    printf("dayの値は%dで、pageの値は%dです。\n", day, page);

    // double型の変数hoursとtarget_hoursを宣言する
    ➂ ;

    // hoursに2.75、target_hoursに4.50を代入する
    ➃ ;
    ➄ ;
    printf("hoursの値は%.2fで、target_hoursの値は%.2fです。\n", hours, target_hours);

    // char型の変数gradeを宣言し、ASCIIコード66で初期化する
    ➅ ;   // ASCIIコード66は'B'
    printf("gradeの値は%cです。\n", grade);

    return 0;
}

実行結果例

dayの値は5で、pageの値は18です。
hoursの値は2.75で、target_hoursの値は4.50です。
gradeの値はBです。

解答例

ファイル名:4_3_4.c

#include <stdio.h>

int main(void)
{
    // int型の変数dayとpageを宣言し、dayには5、pageには18で初期化する
    int day = 5;
    int page = 18;
    printf("dayの値は%dで、pageの値は%dです。\n", day, page);

    // double型の変数hoursとtarget_hoursを宣言する
    double hours, target_hours;

    // hoursに2.75、target_hoursに4.50を代入する
    hours = 2.75;
    target_hours = 4.50;
    printf("hoursの値は%.2fで、target_hoursの値は%.2fです。\n", hours, target_hours);

    // char型の変数gradeを宣言し、ASCIIコード66で初期化する
    char grade = 66;   // ASCIIコード66は'B'
    printf("gradeの値は%cです。\n", grade);

    return 0;
}

解説(実践問題)

この問題では、初期化と代入を混ぜて使えるかを確認しています。

① ② のポイント(int の初期化)

int day = 5;
int page = 18;

宣言と同時に値を入れているので、これは初期化です。
最初から値が決まっているときは、この書き方が分かりやすいです。

③ のポイント(double の宣言)

double hours, target_hours;

同じ型なので、カンマでまとめて宣言できます。
ただし、変数名は意味が分かるようにしているのがポイントです。

④ ⑤ のポイント(double の代入)

hours = 2.75;
target_hours = 4.50;

宣言した後で値を入れているので、これは代入です。
後から決める値はこの形で設定します。

⑥ のポイント(char の初期化)

char grade = 66;

char は1文字を扱う型ですが、ASCIIコード(整数)で代入することもできます。
66 は文字 B に対応しているので、%c で表示すると B が出ます。

さらに理解を深めるミニ補足

初期化と代入は組み合わせて使ってOK

実際のプログラムでは、次のように混在するのが普通です。

  • すぐ決められる値 → 初期化
  • 実行中に決まる値 → 代入

この使い分けが自然にできると、コードがかなり書きやすくなります。

迷ったら初期化を優先しよう

特に学習中は、迷ったら初期化しておくのがおすすめです。
不定値のバグを防ぎやすくなります。

まとめ

このパートでは、変数の初期化と代入の基本を学びました。

  • 宣言しただけの変数は不定値
  • 不定値のまま使うのは危険
  • 初期化は宣言と同時に値を入れる。
  • 代入は宣言後に値を入れる。
  • 変数は使う前に必ず値を設定する。

ここをしっかり押さえると、この先の scanf による入力、計算、条件分岐でもミスが減っていきます。
C言語では「値を入れてから使う」を基本ルールとして、ぜひ習慣にしていきましょう。