法大奥山研究室

 previous  contents

5. 単純代入演算子 =


 初期化子が付された宣言を初期化(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)となり,文法上完結します。

* m = 1;宣言ではなく,である。

 一般に,メモリに記憶されている値が変化するなど,プログラムの実行環境を変化させることを副作用(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 = mnm の値が代入されます。(n = m)n = m の値,すなわち,1 です。代入式自体,値を持ちます。それは左辺側の変数の値です。[C99, 6.5.16, 3] p = (n = m) でそれを p に代入します。

Q 左辺値(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)という。


 previous  contents