C言語基礎|初期化と代入の違い

変数は「作っただけ」では安心できない

前の記事では、変数に値を入れて表示するプログラムを作成しました。
では、変数を宣言しただけで、値を入れなかったらどうなるでしょうか。

まずは、次のプログラムを見てみましょう。
(実験用のため、あえて値を入れていません)

値を入れずに変数を使うとどうなる?

プロジェクト名:chap1-10-1 ソースファイル名:chap1-10-1.c

// 二つの変数を宣言しただけで表示する

#include <stdio.h>

int main(void)
{
    int a, b;   // a と b は int 型の変数(値は入れていない)

    printf("aの値は%dです。\n", a);
    printf("bの値は%dです。\n", b);

    return 0;
}

実行結果の一例

aの値は4213です。
bの値は-9821です。

表示される数値は、毎回同じとは限りません。
実行する環境やタイミングによって、まったく違う値になることもあります。

変数の中身は「最初はゴミの値」

実は、変数が生成された直後の中身には、
不定値(ゴミの値)
が入っています。

状態変数の中身
宣言直後何が入っているか分からない。
値を入れた後指定した値

そのため、
値を入れていない変数から値を取り出すと、予想外の結果になる
のです。

場合によっては、

  • 変な数値が表示される。
  • 実行時エラーが発生する。

といったことも起こります。

変数は作るときに値を入れるのが安全

変数を作るとき、
最初から入れる値が分かっている場合 は、
宣言と同時に値を入れておくのが安全です。

この操作を
初期化
と呼びます。

初期化を行う宣言の例

プロジェクト名:chap1-10-2 ソースファイル名:chap1-10-2.c

// 変数を初期化して表示する

#include <stdio.h>

int main(void)
{
    int a = 30;        // a を 30 で初期化
    int b = a + 15;    // b を a + 15 で初期化

    printf("aの値は%dです。\n", a);
    printf("bの値は%dです。\n", b);

    return 0;
}

実行結果

aの値は30です。
bの値は45です。

このように、
宣言と同時に値を入れておくことで、安心して変数を使える
ようになります。

初期化子とは何か

宣言の中で = の右側に書かれている値は、
初期化子(initializer)
と呼ばれます。

int a = 30;
要素意味
int変数の型
a変数名
30初期化子

初期化子で指定した値は、
変数が生成される瞬間に代入される
のが特徴です。

初期化と代入はタイミングが違う

見た目はよく似ていますが、
初期化代入 は意味が異なります。

操作いつ値が入るか
初期化変数が生成されるとき
代入変数が生成されたあと

初期化の例

int x = 10;

これは、
「x を作ると同時に 10 を入れる」
という意味です。

代入の例

x = 10;

こちらは、
「すでに存在する x に 10 を入れ直す」
という意味になります。

図でイメージしてみよう

  • 初期化
    ・箱を作る
    ・すぐに値を入れる
  • 代入
    ・すでにある箱を使う
    ・中身を入れ替える

この違いを意識することが、
バグを防ぐ第一歩 になります。

複数の変数を同時に初期化する

複数の変数も、
次のようにまとめて初期化できます。

int p = 5, q = 9;

これは、

  • p を 5 で初期化
  • q を 9 で初期化

していることを意味します。

この章で押さえておきたいポイント

ポイント内容
宣言直後の変数不定値が入っている。
初期化生成時に値を入れる。
代入生成後に値を入れる。
おすすめ宣言と同時に初期化

使う前に必ず値を入れる
この習慣を身につけておくと、
プログラムはぐっと安全になります。

演習問題

演習 1-4

int 型の変数を宣言し、
実数値(たとえば 4.8)を初期化子として与える
プログラムを作成し、実行結果を確認せよ。

解答例

プロジェクト名:chap1-10-3 ソースファイル名:chap1-10-3.c

// int型変数に実数値で初期化してみる

#include <stdio.h>

int main(void)
{
    int value = 4.8;

    printf("valueの値は%dです。\n", value);

    return 0;
}

実行結果

valueの値は4です。

実数値は int 型に代入される際、
小数点以下が切り捨てられる
ことが確認できます。