忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【C言語入門】変数の宣言と初期化:C99規格で変わった「自由な書き方」


プログラムの中で値を一時的に保存しておく「箱」が変数です。今回は基本中の基本である整数型(int)を例に、その宣言方法と、規格の進化によって効率化したポイントを解説します。

1. 実践:int型の宣言と初期化

【 動作確認 】 以下のコードを `var.c` として保存して実行します。変数 `a` に値を格納し、表示する基本的な構造です。

#include <stdio.h>

int main(void) {
    int a = 10; // 宣言と同時に初期化

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

    a = 20; // 値の書き換え(代入)
    printf("書き換え後の値は %d です\n", a);

    return 0;
}

2. 規格による宣言位置の制限と緩和

【 仕組みの解説 】 C言語の規格によって、変数を宣言できる場所のルールが異なります。現代のMac環境(C11/C17)では、C99以降の緩和されたルールが適用されています。

古い規格(C89以前)
変数の宣言は、ブロック( { } )の先頭にまとめて記述しなければなりませんでした。

// C89スタイル
int main(void) {
    int a;
    int b;

    a = 10;
    b = 20;
    return 0;
}


現代の規格(C99以降)
「任意の位置」で宣言が可能になりました。これにより、ロジックの途中で必要になったタイミングで変数を定義できます。

// C99以降のスタイル(Macのデフォルト)
int main(void) {
    int a = 10;
    printf("%d\n", a);

    int b = 20; // 必要になった段階で宣言が可能
    printf("%d\n", b);
    return 0;
}

3. 未初期化変数のリスク

【 技術的注意点 】 `int a;` のように初期化を行わずに宣言した場合、その変数にはメモリ上に残っていた以前のデータ(不定値)が保持されます。これをそのまま使用すると意図しない挙動やバグの原因となるため、宣言時に明示的に初期化を行うことが推奨されます。

4. 変数の性質に応じた宣言位置の選択

現代の規格では自由な位置で宣言が可能ですが、コードの可読性を保つためには変数の役割に応じた整理が有効です。

一時的な計算用変数:使用する直前で宣言することで、変数の有効範囲(スコープ)を限定し、コードの複雑さを抑えます。
主要な制御変数:関数全体に関わる重要な変数は、あえて冒頭にまとめることで、その処理で何が中心的な役割を果たすかを明示できます。

5. 理解度チェック!練習問題

【 復習問題 】 現代のC言語(C99以降)における変数の宣言について、**正しい説明**はどれでしょうか?

選択肢:
A. 変数の宣言は必ず関数の1行目に書かなければならない。
B. `int a = 10;` のように、宣言と同時に値を代入(初期化)することができる。
C. 初期化していない変数には、自動的に「0」が代入される。
D. `int` 型の変数には、後から文字列を代入できる。

正解と解説を見る

正解:B

宣言と同時に初期化を行うのは、現代のC言語における標準的な作法です。初期化されていない変数には不定値が入るため、Bが唯一の正解となります。

6. まとめ

C99規格による制約の緩和は、C言語の記述効率を大きく向上させました。MacのClang環境では、これらのモダンな仕様をデフォルトで利用できます。変数の性質を見極め、適切な位置で宣言・初期化を行うことで、堅牢なプログラムの構築が可能になります。

PR