実は😝列挙体の文字定数には数値が割り振られています

アレサ 「実は


Fruitsの列挙体宣言


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


を行うと


Fruitsの列挙体宣言の{}内の


左のOrangeから順に数値0,1,2・・・


と番号が割り振られていきます。


試しに


Fruitsの列挙体宣言


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


を行い


Orangeを%d出力変換指定子をつかって


printf出力表示すると


#include<stdio.h>


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


int main(void){

printf("%d",Orange);

return 0;

}


コンパイル結果

0


が表示されます。


もう1つ試してみますね。


今度は

int型のaの変数宣言を行って


変数aを作製したように


列挙体Fruits型のfruitsの列挙体変数宣言を行い


列挙体変数fruitsを作製して


列挙体変数fruitsに文字定数Lemonを


代入して


列挙体変数fruitsに格納された文字定数Lemonを

%d出力変換指定子をつかってprintf出力表示すると


#include<stdio.h>

typedef enum Fruits{Orange, Apple, Lemon }Fruits;


int main(void){

Fruits fruits;

fruits=Lemon ;


printf("%d", fruits);


return 0;

}


コンパイル結果

2


コンパイル結果は

2が表示され


文字定数Lemonに数値2が割り振られているのが


わかります。


つまり

Orange=0

Apple=1

Lemon=2

と文字定数に数値が割り当てられており


今までのプログラムで

Orange

Apple

Lemon

と記述された箇所は


すべて


数値

0

1

2

に変更可能です。


先のエピソードのプログラム⇩


#include<stdio.h>


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


int main(void){

Fruits fruits;

fruits=Lemon ;


switch(fruits){


case Orange: printf("オレンジ色です。\n");break;

case Apple: printf("りんご色です。\n");break;

case Lemon: printf("レモン色です。\n");break;

}

return 0;

}


の

Orange

Apple

Lemon

と記述された箇所を

以下のプログラムのように


数値

0

1

2

に変更可能なのですね。


#include<stdio.h>


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


int main(void){

Fruits fruits;

fruits=2 ;


switch(fruits){


case 0: printf("オレンジ色です。\n");break;

case 1: printf("りんご色です。\n");break;

case 2: printf("レモン色です。\n");break;

}

return 0;

}


」


ソーラー「はうぅ・・・」


アレサ「どうかされましたの? ソーラーさん😊」


ソーラー「はっ いやあ、ここまできたんだなあっと


ちょっと感慨に耽っていたよ・・・


この

文字定数

Orange

Apple

Lemon

を

数値

0

1

2

に変更したプログラムでは


文字定数Lemonをつかったときのような


「Lemon」を代入したら


コンパイル結果


レモン色です


のようなわかりやすさがないかな。


というより


この変更されたプログラムを よくみると


文字定数Orange, Apple, Lemonが使われてなくて


列挙体宣言をおこない


文字定数

Orange

Apple

Lemon

を


作製する意味が   


       ”全(また~く)くない”💖 


                     のがミソだね。」


アレサ「そうなんです。


作製した文字定数はうまくつかってくださいね」


アレサ「また


先程のFruitsの列挙体宣言では


typedef enum Fruits{Orange, Apple, Lemon }Fruits;


{}内の


左のOrangeから順に数値0,1,2・・・


と自動的に番号が割り振られていましたが


列挙体宣言で格納された文字には自由に


番号を割り振ることができます


表記方法は


例)


typedef enum Fruits{Orange=7, Apple=0, Lemon =1}Fruits;


のようになります。


プログラムを構成してみると


#include<stdio.h>


typedef enum Fruits{Orange=7, Apple=0, Lemon =1}Fruits;


int main(void){

Fruits fruits;

fruits=Lemon;


switch(fruits){


case 7: printf("オレンジ色です。\n");break;

case 0: printf("りんご色です。\n");break;

case 1: printf("レモン色です。\n");break;

}

return 0;

}


コンパイル結果


レモン色です


となり


Lemonに割り振られている数値が1に変更されているのが


わかります。


また


この↓の列挙体宣言のように


typedef enum Fruits{Orange=7, Apple, Lemon }Fruits;

文字定数

Orangeにだけ


Orange=7に

変更を行うと


その次の

文字定数

Apple

Lemon

には


8

9

と順番に

1ずつ数値が増加しながら割り振られていきます。


以下のように

typedef enum Fruits{Orange=7, Apple, Lemon }Fruits;

を

プログラムに組み込んでみると


#include<stdio.h>


typedef enum Fruits{Orange=7, Apple, Lemon }Fruits;


int main(void){

printf("%d\n",Orange);

printf("%d\n", Apple);

printf("%d\n", Lemon);


return 0;

}

コンパイル結果

7

8

9


となり


Orange=7

Apple=8

Lemon=9


と数値が割り振られているのがわかります。


もうひとつ おまけに


プログラムを構成してみると


#include<stdio.h>


typedef enum Fruits{Orange, Apple=7, Lemon }Fruits;


int main(void){


printf("%d\n",Orange);

printf("%d\n", Apple);

printf("%d\n", Lemon);


return 0;

}


コンパイル結果

0

7

8



Orangeにはいつも通り0が割り振られ


真ん中のAppleには


Apple=7と数値が割り振られたので


その1つの右隣の


Lemonに割り振られた数値は1増加して8になっているのがわかります。

」


ソーラー「列挙体も文字定数を格納するというデータのいれものだったんだね。


構造体も

共用体も

列挙体も


データを格納するいれものだったというわけだったんだ・・


データ格納方法はこれでおわりかな?」


アレサ 「もし 機械語をつかいこなすことができれば


今、C言語で使われている


構造体

共用体

列挙体

だけでなく


自由に

データを格納するいれものがつくれますの。」


ソーラー

「そうなのぉ


データを格納する新しいいれもの

自然体

健康体

発光体

なんてこっ体

飛んでいき体

ディズニーランドにいき体


なんかも自分でつくれたら楽しいね。」


アレサ「実際に 自分で数値データを格納する


いれものをつくることができれば


今までの

構造体

共用体

列挙体

を


さらに改良した

新しい体

を形成することは可能とおもわれますの。」


ソーラー「そこまでいくと


もう新しいプログラミング言語を作るような感覚だね。」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます