列挙

列挙 (enumeration) は連続する整数に名前を付けるための機能です。
構文 enum [tag] { names,... } [vars],... ;
enum tag vars,... ;
※ここで namesname[=value]

names で定義した個々の列挙名には、0 から順番に整数が割り当てられます。
enum { a, b, c }; // a=0, b=1, c=2

これらの列挙名は、プログラム中で整数定数と同じように使用できます。
if ( x == b ) ...;
switch ( x ) {
  case a: ...;
  case b: ...;
  case c: ...;
}

列挙名の値を = で明示的に指定することもできます。その場合は、後続の列挙名の値も影響を受けます。
enum { a, b, c=10, d, e }; // a=0, b=1, c=10, d=11, e=12

複数の列挙名に同じ値を割り当てることもできます。
enum { a, b, c=0, d, e }; // a=0, b=1, c=0, d=1, e=2

列挙型の変数を定義できます。列挙型は int 型と同じものと見なされます。ただし、-wenum を指定した場合は、他の型への変換が警告されます。
enum { a, b, c } e; // int 型と同じサイズの変数 e を定義
e = a; // 有効
int i = e; // 有効
e = i; // -wenum:1 なら警告
enum { ax, ay, az }; // ax=0, ay=1, az=2
enum { bx=1, by, bz }; // bx=1, by=2, bz=3
enum { cx, cy=0, cz }; // cx=0, cy=0, cz=1
enum { dx, dy } e1; // dx,dy と列挙型変数 e1 を定義
enum tag { ex, ey }; // ex,ey と列挙タグ tag を定義
enum tag e2, e2b; // tag 型で e2 と e2b を定義
e1 = dx; // 有効
e1 = ex; // -wenum:1 なら警告
int i = dx; // 有効
e1 = i; // -wenum:1 なら警告
e1 = e2; // -wenum:1 なら警告
e2 = e2b; // 有効