=初期化子が付された宣言を初期化(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)
 左辺値(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)という。