記事には広告を含む場合があります。

C言語入門講座

【C/C++】列挙型(enum)の使い方!int型?サイズは?

おゆ

組み込み系プログラマとして5年働いていた元エンジニアです。得意言語はC言語とC++。本サイトでは学生および新人組み込み系プログラマに向けてプログラミング知識をわかりやすく解説しています。

enumとは文字列と数字を関連付けられる機能です。

コードを読みやすくするために使われます。

enumとは?いつ使うの?

enumは列挙型とも呼ばれます。

enumを使うと文字列と数字を関連付けられ、コードが読みやすくなります。

人間にとっては文字列で書いてあった方がわかりやすいけど、プログラム的には数字として扱う方が都合がいいといった場合に使います。

例えば製品の動作確認をした結果を合格と不合格に分けるとします。

プログラム内で結果をPass、Failのように文字列で扱うとデータが大きくなりますし、switch文が使えないなど不便です。

一方、合格は0、不合格は1というように数字で扱えば文字例よりデータは小さいですし、switch文で使えたり配列のインデックスとして使えたりと扱いやすくなります。

しかし数字を見ただけではどちらが合格なのかわかりにくいです。

enumを使えばPass、Failのように文字例で書けるのでどちらが合格か見分けられます。

その上Passには0、Failには1が割り当てられるので、そのままswitch文や配列のインデックスとして使えます。

おゆ
enumを使わなくてもコーディングは可能ですが、使うとコードの可読性が増す便利な機能です。

enumの使い方

基本的な使い方

enumの使い方

定義方法:
enum タグ名{メンバ1,メンバ2,...};

宣言方法:
enum タグ名 変数名;

例1:

#include <stdio.h>
enum weather
{
    sunny,
    cloudy,
    rainy
};
void main()
{
    enum weather day1, day2, day3;
    day1=sunny;
    day2=cloudy;
    day3=rainy;
    printf("day1=%d\n",day1);
    printf("day2=%d\n",day2);
    printf("day3=%d\n",day3);
}

実行結果

day1=0
day2=1
day3=2

enumのメンバには数字が0, 1, 2,...というように自動的に割り当てられます。

初期値を指定する方法

メンバに割り当てられる数字を指定したい場合は定義時に初期値を代入しておきます。

例2:

#include <stdio.h>
enum weather
{
    sunny=1,
    cloudy,
    rainy,
    snowy=10,
    windy
};
void main()
{
    enum weather day1, day2, day3;
    day1=sunny;
    day2=cloudy;
    day3=windy;
    printf("day1=%d\n",day1);
    printf("day2=%d\n",day2);
    printf("day3=%d\n",day3);
}

実行結果

day1=1
day2=2
day3=11

値を指定したメンバの次のメンバには連番で番号が割り当てられます。

typedefでenumのコードを簡略化する方法

typedefを使うとenum変数を作るときのコードを簡略化できます。

例3:

#include <stdio.h>
typedef enum
{
    sunny,
    cloudy,
    rainy
}weather;
void main()
{
    weather day1;
    day1=sunny;
    printf("day1=%d\n",day1);
}

実行結果

day1=0

typedefの使い方について詳しくは以下の記事で解説しています。

参考【C/C++】typedefとは?構造体(struct)での使い方

C言語においてtypedefを使うと構造体の宣言をスマートに書くことができます。 一方、C++でもtypedefは使えますが、構造体と一緒には使わないです。 typedefとは何かわかりやすく解説 t ...

続きを見る

enumはint型?サイズは?

enum変数の型は何になるのかな?変数のサイズはいくつになるの?
おゆ
enum変数の型は整数と決まっています。だたしint型か他の型かは開発環境によって異なります。変数サイズは都度sizeofを使って知ることができます。

enum変数のサイズは以下のように取得できます。

例4:

#include <stdio.h>
enum weather
{
    sunny,
    cloudy,
    rainy
};
void main()
{
    enum weather day1;
    day1=sunny;
    printf("day1 size=%d\n",sizeof(day1));
}

メモ

day1 size=4

筆者の環境ではint型と同じ4バイトでした。

enumはint型にキャストできる?

enum変数はint型変数に代入できるの?
おゆ
代入できます。筆者の環境では暗黙的型変換が行われましたが、そうでない場合はキャストすることでint型に変換できます。

例5:

#include <stdio.h>
enum weather
{
    sunny,
    cloudy,
    rainy
};
void main()
{
    enum weather day1;
    int i1,i2;
    day1=sunny;
    i1=day1; //暗黙的型変換
    printf("i1=%d\n",i1);
    i2=(int)day1; //キャスト(明示的型変換)
    printf("i2=%d\n",i2);
}

実行結果

i1=0
i2=0

C言語で行き詰まったら…

C言語・C++がわからない時に質問できるサイト・サービス5選

C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...

続きを見る

ブログランキング参加中。クリックしてもらえると励みになります。

ブログランキング・にほんブログ村へ

-C言語入門講座