9-5 列挙体

この記事は約4分で読めます。

列挙体とは、プログラム中で出てくる定数に名前を付ける機能です。通常は#define指令を使って定数を定義しますが、列挙体を使うとまとめて定数を定義することができます。

定義方法

enum 列挙体タグ名{
	定数1,
	...
};

定数には、0から順番に整数値が割り当てられます。構造体や共用体の時と同じように、列挙体の定義と同時に変数を定義したり、typedef宣言を用いて短い型名を付けることもできます。

ただし、メンバ定数にセミコロンをつけてはいけません。

#include<stdio.h>
#include<stdlib.h>
typedef enum{
	KOKUGO,SUUGAKU,RIKA,SHAKAI
}kamoku;
int main(void){
	kamoku class;
	class=KOKUGO;
	printf("class:%d\n",class);
	class=SUUGAKU;
	printf("class:%d\n",class);
	class=RIKA;
	printf("class:%d\n",class);
	class=SHAKAI;
	printf("class:%d\n",class);
	return 0;
}

実行結果

class:0
class:1
class:2
class:3

kamoku型は列挙体型です。メンバ定数のOKUGO,SUUGAKU,RIKA,SHAKAIにはそれぞれ0,1,2,3が割り当てられます。#define指令と同じように、コンパイル時に整数値に置換されます。これらの整数値はint型になる場合が多いです(処理系依存)。C言語の場合では、列挙体型とint型の違いは考えなくてもよいでしょう。

定数値の変更

列挙型の中で定義した定数は0から順番に値が割り当てられると書きましたが、値を途中で変えることが可能です。具体的には、列挙型の定義の途中で定数に値を代入すると、その値に変更することができます。

enum 列挙体タグ名{
	定数1,
	...,
	定数=値,
	...
};

途中で定数の値が変わると、それ以降の定数はその値よりも数字が大きくなります。

#include<stdio.h>
#include<stdlib.h>
typedef enum{
	KOKUGO,SUUGAKU,RIKA=3,SHAKAI
}kamoku;
int main(void){
	kamoku class;
	class=KOKUGO;
	printf("class:%d\n",class);
	class=SUUGAKU;
	printf("class:%d\n",class);
	class=RIKA;
	printf("class:%d\n",class);
	class=SHAKAI;
	printf("class:%d\n",class);
	return 0;
}

実行結果

class:0
class:1
class:3
class:4

定数KOKUGO,SUUGAKUは先ほどと同様0,1が代入されています。定数RIKAに3を代入したので、RIKAより後に定義した定数であるSHAKAIは3よりも大きい数字4が代入されます。これ以降に定数を定義すると値は5,6,…となります。

なお、複数の定数が同じ値を持つようになっても問題ありません。なぜなら、定数は整数に置換されるだけであって定数自体を区別する必要はないからです。

無名列挙型

列挙体型名を省略することができます。列挙体型名を省略するすると、列挙型として使用することはできず、定数のみ利用可能です。

enum {KOKUGO,SUUGAKU,RIKA,SHAKAI};

これは、以下と同等の意味になります。

#define KOKUGO	0
#define SUUGAKU	1
#define RIKA	2
#define SHAKAI	3

まとめ

それぞれ異なる値を持つ定数値を複数宣言するには、列挙体を使うと便利。

列挙型はintと互換性がある。

コメント

タイトルとURLをコピーしました