詳細なC言語の列挙列挙型

列挙型

私たちは、列挙形式を使用して、マクロのコンパイルフェーズとして理解することができます。

列挙型名{valueName1、valueName2、valueName3、......};

typeNameある列挙型の名前、(列挙体)内の要素がブレースである定数ではなく変数列挙メンバーが一定であるため、これは、明確にする必要があり、それが彼らに割り当てることができない、それらの値のみを割り当てることができます他の変数へ

列挙型(列挙タグ)、列挙体(列挙定数)、列挙差

列挙列挙型と、定義一緒に入れたときに列挙型の名前を図文言上の二つがあることを意味し、(その週の列挙の週に、ある)を省略することができます

最初:

列挙週{月= 1、火、水、木} NUM。

第二:

列挙 {月= 1、火、水、木} NUM。

列挙型変数の定義はと型変数が似た構造を定義するが、この事実は、および未知の構造の構造は、非常に似ていますが、両者の差がまだかなり大きいです、メンバーの数を含む構造体の型の変数、それは、パッケージ宅配ボックスに対応します

列挙型変数は、列挙型変数ではありませんいくつかのメンバー、列挙型と変数intの収集、変数のchar型とほぼ同じが含まれていますが、列挙型変数の代入だけ自分自身を使用することができ、同じではありません列挙メンバーは、上記の例に割り当てられ、

NUM割り当てのみ割り当てるように他の列挙型列挙のメンバーで列挙部材月、火、水、木、及びませんを使用することができ

 

同じ変数定義列挙および構造の定義、2つの定義された方法があります

列挙の定義しつつ、第1 :(定義列挙型)

列挙週{月= 1、火、水、木} NUM。

第二种:(先定义枚举类型,再定义枚举变量)

enum week{Mon = 1, Tues, Wed, Thurs};
enum week num;

枚举类型的特点

下面将用不同的示例来说明枚举类型的特点

示例一:(不显式说明枚举常量的值)

enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};

在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1,所以Mon=0,Tues=1,····Sun=6,下面来验证一下

enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:

示例二:(显示说明部分枚举常量的值)

enum week{Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun};

上面的代码中,只显式说明了枚举常量Mon的值为1,未指定的枚举名的值将依着最后一个指定值向后依次递增(注意是最后一个指定值)

enum week{Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:

对上面的代码稍加修改

enum week{Mon = 1, Tues, Wed, Thurs, Fri = 10, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:

示例三:(对枚举变量进行赋值)

enum week{Mon = 1, Tues, Wed, Thurs}num;

num = (enum week)10;
printf("%d", num);

一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量,

运行结果:

总结:

1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1

2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增

3、一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值

4、同一枚举类型中不同的枚举成员可以具有相同的值

5、同一个程序中不能定义同名的枚��类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)

enum与typedef配合使用

typedef enum week my;

或者

typedef enum week{Mon = 1, Tues, Wed, Thurs}my;

上面typedef也可以省略week

typedef enum{Mon = 1, Tues, Wed, Thurs}my;

上面两种形式中,my都是enum week的别名(意思是my和enum week等价),需要注意的是如果将第二句的typedef去掉那么my就变成了enum week类型的变量,如果加上typedef那么my就是enum的别名,这点要注意区分

在定义了enum week的别名my后,后面就可以使用my来定义枚举类型变量

my num;

num = (enum week)10;
printf("%d", num);

上述语句中的(enum week),可以改为(my),两者效果是一样的

补充:对上面总结的第五点:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)进行验证

enum m1{m1, m2};
enum m2{m3, m4};
enum m1{m5, m6};

上述代码定义的枚举类型enum m1多次定义,是不允许的,编译器会报错还有一种特殊情况,即使定义了同名的枚举类型,编译器也不会报错

enum m1{m1, m2};
enum m2{m3, m4};
enum m1;

上面的代码中,第二个enum m1没有定义枚举成员,在编译阶段是不会报错的(估计是编译器并不认为定义了枚举成员的enum m1 和 没有定义枚举成员的enum m1是同名的枚举类型

enum的赋值范围

这个也是无意间注意到的,文章在开头提到枚举类型描述的是一组整型值的集合,枚举类型的占的字节数是4个字节,所以我们可以用INT_MAX和INT_MIN来测试枚举类型的赋值范围,赋值的最大值应该是INT_MAX(也就是2147483647),下面用代码来测试一下

enum test{m1=INT_MAX};
printf("%d\n%d\n", m1, INT_MAX);

运行结果:

 

上面的代码没有问题,下面来测试一下越界的赋值

enum test{m1=INT_MAX+1};
printf("%d\n%d\n", m1, INT_MAX);

 编译器在编译阶段会有警告测试了枚举类型的最大值,下面来测试下枚举类型的最小值

enum test{m1=INT_MIN};
printf("%d\n%d\n", m1, INT_MIN);

运行结果:

上面的代码没有问题,下面来测试一下越界的赋值

enum test{m1=INT_MIN-1};
printf("%d\n%d\n", m1, INT_MIN);

和上面相同,编译器也会有警告

为什么“枚举类型描述的是一组整型值的集合”其实不太妥当?

上面这句话很容易让读者以为enum类型和int类型是等价的,好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的,因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解为什么基本类型。

おすすめ

転載: www.linuxidc.com/Linux/2019-08/159760.htm