=
初期化子が付された宣言を初期化(Initialization)といいます。また,変数の値を記憶させる宣言をその変数の定義と言います。[C99, 6.7, 5] 初期化は変数の値をメモリ領域に記憶させるので定義です。これまで見た宣言はすべて初期化であり,したがって,定義となります。
これに対し,初期化せずにとりあえず変数を宣言し,後に値を記憶させることもできます。
/* Example 5.1 */ #include <stdio.h> int main(void) { int m; m = 1; printf("m = %d\n", m); return 0; }
宣言
int m;
には初期化子がありません。この段階でメモリには,ゴミのようなものが記憶されています。初期化されていないので,m
を参照するとその「ゴミ」を使用することになります。次の
m = 1;
の m = 1
は「代入式」(Assignment Expression)と呼ばれる「式」(Expression)です。この式が実行されると,メモリに 1
が記憶されます。そして,セミコロン ;
で「文」(Statement)となり,文法上完結します。
一般に,メモリに記憶されている値が変化するなど,プログラムの実行環境を変化させることを副作用(Side Effect)と呼びます。演算子の多くは副作用を起こします。文 m = 1;
の =
は「単純代入演算子」と呼ばれ,副作用を起こす代表的な演算子です。
■単純代入演算子(Simple Assignment Operator) | |
変数 = 式 | 式 の値を 変数 に代入。 |
/* Example 5.2 */ #include <stdio.h> int main(void) { int m = 1, n, p; p = (n = m); printf("m = %d, n = %d, p = %d\n", m, n, p); return 0; }
実行結果です。
m = 1, n = 1, p = 1
n = m
で n
に m
の値が代入されます。(n = m)
は n = m
の値,すなわち,1
です。代入式自体,値を持ちます。それは左辺側の変数の値です。[C99, 6.5.16, 3] p = (n = m)
でそれを p
に代入します。
左辺値(lvalue)
元来,代入演算子の左辺側にとれるものを「左辺値」と呼んでいた。仕様(C99)では,オブジェクト型,あるいは void
以外の不完全型の式を左辺値という。[C99, 6.3.2.1, 1] 代入演算子の左辺側にとれる変数は,仕様(C99)に基づくと,変更可能な左辺値(modifiable lvalue)と呼ばれているものになる。[C99, 6.15.6, 2] これには不完全型は含まれない。[C99, 6.3.2.1, 1] 後に「9. 配列」で見る
char str[] = "language";
の str[]
は不完全型であるので,初期化(宣言)に使う =
は代入演算子ではないことが理解できる。ちなみに,式の値を「右辺値」(rvalue)という。