C言語の変数を理解する:型、命名規則、メモリ管理
変数とは
変数とは、プログラムが操作できるストレージ領域に与えられた名前です。Cの各変数には特定の型があり、それが変数のメモリのサイズとレイアウト、そのメモリに格納できる値の範囲、変数に適用できる操作のセットを決定します。
変数名は文字、数字、アンダースコア文字で構成できます。文字またはアンダースコアで始まる必要があります。大文字小文字は区別されます(Cは大文字小文字を区別します)。前章で説明した基本型に基づくと、以下の基本変数型があります:
| 番号 | 型と説明 |
|---|---|
| 1 | char 通常1オクテット(1バイト)。整数型です。 |
| 2 | int マシンにとって最も自然な整数サイズ。 |
| 3 | float 単精度浮動小数点値。 |
| 4 | double 倍精度浮動小数点値。 |
| 5 | void 型の不在を表します。 |
Cプログラミング言語では、列挙型、ポインタ、配列、構造体、共用体など、その他様々なタイプの変数も定義できます。これらは後の章で扱います。この章では基本変数型のみを学習します。
C言語での変数定義
変数定義は、コンパイラに変数のストレージをどこにどれだけ作成するかを伝えます。変数定義はデータ型を指定し、その型の変数を1つ以上リストします:
type variable_list;
ここで、typeはchar、w_char、int、float、double、bool、またはユーザー定義オブジェクトなどの有効なCデータ型でなければならず、variable_listはカンマで区切られた1つ以上の識別子名で構成されます。有効な宣言例:
int i, j, k; char c, ch; float f, salary; double d;
int i, j, k;という行は、i、j、kという変数を宣言・定義し、コンパイラにint型のi、j、kという名前の変数を作成するよう指示します。
変数は宣言時に初期化(初期値の割り当て)できます。初期化子は等号に続けて定数式を記述します:
type variable_name = value;
例:
extern int d = 3, f = 5; // dとfの宣言 int d = 3, f = 5; // dとfの定義と初期化 byte z = 22; // zの定義と初期化 char x = 'x'; // 変数xに値'x'が入る
初期化子なしの定義の場合:静的ストレージ期間を持つ変数は暗黙的にNULL(すべてのバイトが0)で初期化され、それ以外の変数の初期値は未定義です。
C言語での変数宣言
変数宣言は、与えられた型と名前の変数が存在することをコンパイラに保証し、コンパイラが変数についての完全な詳細を必要とせずにそれ以上のコンパイルを進められるようにします。変数定義はコンパイル時のみ意味を持ち、リンク時に実際の変数定義が必要です。
複数のファイルを使用していて、変数をそのうちの1つのファイルで定義し(リンク時に利用可能になる)、他のファイルで参照する場合に変数宣言が有用です。任意の場所で変数を宣言するにはキーワードexternを使用します。Cプログラムで変数を複数回宣言できますが、定義は1つのファイル、関数、またはコードブロックでのみ可能です。
例
以下の例では、変数をトップで宣言し、main関数内で定義・初期化しています:
Live Demo#include <stdio.h>
// 変数宣言:
extern int a, b;
extern int c;
extern float f;
int main() {
/* 変数定義: */
int a, b;
int c;
float f;
/* 実際の初期化 */
a = 10;
b = 20;
c = a + b;
printf("value of c : %d \n", c);
f = 70.0/3.0;
printf("value of f : %f \n", f);
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
value of c : 30 value of f : 23.333334
同じ概念が関数宣言にも適用されます。関数宣言時に関数名を提供し、実際の定義は別の場所で行えます:
// 関数宣言
int func();
int main() {
// 関数呼び出し
int i = func();
}
// 関数定義
int func() {
return 0;
}
C言語におけるlvalueとrvalue
Cには2種類の式があります:
- lvalue - メモリ位置を参照する式を「lvalue」式と呼びます。lvalueは代入の左辺値または右辺値のいずれかに現れます。
- rvalue - メモリ内の何らかのアドレスに格納されているデータ値を指します。rvalueは値を割り当てられない式、つまり代入の右辺値には現れますが左辺値には現れません。
変数はlvalueなので、代入の左辺値に現れます。数値リテラルはrvalueなので、代入できず、左辺値に現れません。有効・無効な文の例:
int g = 20; // 有効な文 10 = 20; // 無効な文;コンパイル時エラー
C言語
- C# 変数とプリミティブデータ型:完全マスターガイド
- C# 変数のスコープを理解する:クラス、メソッド、ブロックレベル
- C++変数・リテラル・定数完全ガイド:基礎から実践まで
- C言語変数・定数・リテラル完全ガイド
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C++変数とデータ型:int、double、char、string、boolを徹底解説
- C言語のスコープルール:ローカル、グローバル、仮パラメータの理解
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Python globalキーワード完全マスター: 使い方とタイミング
- Java変数とリテラル:包括的ガイド
- Java変数の種類:ローカル、インスタンス、クラス変数を徹底解説