【C言語入門】列挙型(enum)の使い方

enumって使ってますか?

enumは列挙型といって、複数の変数に一連の整数値を付ける必要がある場合に使用すると便利です。例えばswitch-case文のcaseの値などに使用すると便利です。

この記事では、enumについて

  • 列挙型(enum)とは
  • enumの使い方
  • switch文でenumを使う方法

というように、基本的な内容から具体的な使い方の内容についても解説していきます。今回はenumについて、使い方をわかりやすく解説します!

目次

列挙型(enum)とは

列挙型は、複数の変数に一連の整数値を付けると便利な場合に使用します。

列挙型で定義される変数はメンバと言います。デフォルトでは定義されたメンバの順に0(ゼロ)から整数値が付けられます。最初の値を0(ゼロ)以外で定義することも可能です。

また途中のメンバから付けられる整数値を変えることもできます。

enumの使い方

それではenumの使い方について解説していきます。

基本的な使い方

enumは下記のように定義します。

enumの定義:

enum タグ名 {メンバ[0], メンバ[1], メンバ[2], ・・・};

定義したenumは下記のように宣言して使用します。

enumの宣言:

enum タグ名 オブジェクト名;
オブジェクト名 = メンバ名;

それではサンプルコードで確認していきましょう。

#include <stdio.h>
 
// enum型の定義
enum week {
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
  Sun
};
 
int main(void) {
    // enum型の宣言
    enum week wk0, wk1, wk2;
    
    // enum型のメンバを代入
    wk0 = Mon;
    wk1 = Tue;
    wk2 = Wed;
    
    printf("Monの値は: %d\n", wk0);
    printf("Tueの値は: %d\n", wk1);
    printf("Wedの値は: %d\n", wk2);
    
    return 0;
}

実行結果:

Monの値は: 0
Tueの値は: 1
Wedの値は: 2

このサンプルコードでは、enum型「week」を定義しています。

そしてenum型「week」のオブジェクト「wk0」、「wk1」、「wk2」を宣言しています。「wk0」にはメンバ「Mon」を、「wk1」にはメンバ「Tue」を、「wk2」にはメンバ「Wed」を代入し、それぞれのオブジェクトの値を出力表示しています。

出力表示された結果を確認すると定義したメンバの順に0(ゼロ)から整数値が付けられているのがわかります。

typedefを使って定義、宣言する方法

enumもstructと同じようにtypedef句を使って定義、宣言することができます。

typedefを使ったenumの定義:

typedef enum タグ名 {メンバ[0], メンバ[1], メンバ[2], ・・・} 型名;

タグ名の記述は省略することもできます。typedefを使って定義したenumは下記のように宣言して使用します。

typedefを使った場合のenumの宣言:

型名 オブジェクト名;
オブジェクト名 = メンバ名;

それではサンプルコードで確認していきましょう。

#include <stdio.h>
 
// week型の定義
typedef enum enm {
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
  Sun
} week;
 
int main(void) {
    // week型の宣言
    week wk0, wk1, wk2;
    
    // week型のメンバを代入
    wk0 = Mon;
    wk1 = Tue;
    wk2 = Wed;
    
    printf("Monの値は: %d\n", wk0);
    printf("Tueの値は: %d\n", wk1);
    printf("Wedの値は: %d\n", wk2);
    
    return 0;
}

実行結果:

Monの値は: 0
Tueの値は: 1
Wedの値は: 2

このサンプルコードでは、typedef句を使ってenumのweek型を定義しています。

そしてweek型のオブジェクト「wk0」、「wk1」、「wk2」を宣言しています。「wk0」にはメンバ「Mon」を、「wk1」にはメンバ「Tue」を、「wk2」にはメンバ「Wed」を代入し、それぞれのオブジェクトの値を出力表示しています。

初期化する方法

これまではメンバを定義した順に0(ゼロ)から整数値が付けられていました。

最初のメンバに付ける整数値を定義することができます。また途中のメンバから付ける整数値を定義することもできます。

メンバに付ける整数値を定義する方法は下記のとおりです。

メンバに付ける整数値の定義:

enum タグ名 {メンバ[0], メンバ[1] = 整数値, メンバ[2], ・・・};

それではサンプルコードで確認していきましょう。

#include <stdio.h>
 
// enum型の定義
enum week {
  Mon = 1,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat = 11,
  Sun
};
 
int main(void) {
    // enum型の宣言
    enum week wk1, wk2, wk3, wk11, wk12;
    
    // enum型のメンバを代入
    wk1 = Mon;
    wk2 = Tue;
    wk3 = Wed;
    wk11 = Sat;
    wk12 = Sun;
    
    printf("Monの値は: %d\n", wk1);
    printf("Tueの値は: %d\n", wk2);
    printf("Wedの値は: %d\n", wk3);
    printf("Satの値は: %d\n", wk11);
    printf("Sunの値は: %d\n", wk12);
    
    return 0;
}

実行結果:

Monの値は: 1
Tueの値は: 2
Wedの値は: 3
Satの値は: 11
Sunの値は: 12

このサンプルコードでは、enum型「week」を定義しています。

enum型「week」の最初のメンバ「Mon」に付ける整数値を1に定義しています。また、途中のメンバ「Sat」に付ける整数値を11に定義しています。

そしてenum型「week」のオブジェクト「wk1」、「wk2」、「wk3」、「wk11」、「wk12」を宣言しています。

「wk1」にはメンバ「Mon」を、「wk2」にはメンバ「Tue」を、「wk3」にはメンバ「Wed」を、「wk11」にはメンバ「Sat」を、「wk12」にはメンバ「Sun」を代入し、それぞれのオブジェクトの値を出力表示しています。

出力表示された結果を確認すると整数値1を定義したメンバから順に整数値が付けられているのがわかります。また、途中で整数値11を定義したメンバから順に整数値が付けられているのがわかります。

switch文でenumを使う方法

enumはswitch-case文とあわせてよく使われます。caseの値にenumのメンバを記述することで、場合分けの条件が読みやすくなるからです。

switch文でenumを使う方法についてはこちらで詳しく解説しているので参考にしてくださいね!

まとめ

ここでは、enumの使い方について説明しました。enumはswitch-case文とあわせて使うとcaseの値にenumのメンバを記述することができて、場合分けの条件が読みやすくなるので便利です。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次