C的实用笔记44——枚举类型

Posted lzh201864031

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C的实用笔记44——枚举类型相关的知识,希望对你有一定的参考价值。

1.枚举变量就是符号常量(枚举常量)的集合

2.枚举变量的四要素

与普通变量的四要素完全相同。

1、枚举类型变量的类型:也就是枚举类型,它是我们自创的类型,也是构造类型。它的声明通常不放在函数中,书写的方式就像全局变量,因为它要尽可能让程序中的所有位置都能使用这个类型声明。枚举类型的声明又有三部分:

  1. enum关键字:表示构造的是枚举类型。
  2. 枚举类型名:和结构体一样,编程习惯是用大写开头,小写开头虽然不出错,就是看起来太low了。
  3. 枚举元素列表:枚举元素就是符号常量,且是整型常量(包括整型数和字符)。枚举元素之间用逗号隔开,最后一个枚举元素后面可以加逗号也可以不加逗号,可以给枚举元素赋值。枚举元素写成一行就行了。如果没有给给枚举元素赋值,那么枚举元素的值默认从0开始。比如说一周有七天,从星期一到星期天,我们把它写成枚举元素,按照模7余0、模7余1、..... .... 、模7余6的顺序写,那么就能定义出如下枚举类型:
    enum WeekDay  sun,mon,tue,wed,thu,fri,sat ;
    // 默认从0开始,因此整型常量sun=0,mon=1,tue=2,wed=3,thu=4,fri=5,sat=6

1、枚举类型的知识点:

  1. 枚举类型声明时,末尾加分号;
  2. 同一个枚举类型中,枚举元素不能重名。
    同一个枚举类型中,不允许有枚举元素重名
    enum WeekDay  sun,mon,tue,wed,tue,fri,sat ;

  3. 两个不同的枚举类型,它们里面的枚举元素也不能重名。
    尽管枚举元素在不同的枚举类型中,但是由于枚举元素实际上就是符号常量,因此不能重名
    enum WeekDay  sun,mon,tue,wed,thu,fri,sat ;
    enum Weekend  sat,sun ;

  4. 枚举类型这个构造类型,决定了枚举变量占用空间的大小,系统会在程序运行或编译阶段给你静态分配好内存。可以肯定的是:枚举类型占用4个字节的空间,因为枚举元素只允许是整型常量表达式,而编译器会认为枚举变量就是一个整型变量。
  5. 与int a; 中 类型名是int一个道理,这里enum Weekday 在概念上就相当于 int。

2、枚举变量的名字:是枚举变量定义时候的名字,与 int a; 中变量名是a一个道理。

3、枚举变量的地址:注意枚举元素是个右值,是没有存放在内存里的常量,它们没有也不允许取地址。枚举变量是左值,可以取地址。

4、枚举变量的值:编译器会把枚举变量当做一个整型变量,事实上可以给枚举变量赋任意整型表达式。

3.允许在声明枚举类型时指定若干个枚举元素的值

1、知识点:可以根据需要任意赋值,但是必须是整型表达式(比如10,'a')

enum WeekDay  sun=10,mon,tue='a',wed,thu,fri,sat ;

4.枚举变量的定义(测一下枚举变量和枚举元素的占用空间)

1、知识点:定义的方式和结构体和共用体很像,都有三种,考虑到我们不关心枚举变量,用哪种都无所谓。

  1. 枚举类型声明和枚举变量定义分开写。
    #include <stdio.h>
    enum WeekDay  sun,mon,tue,wed,thu,fri,sat ;
    int main(int argc, char const *argv[])
     
        enum WeekDay w;						//w就是enum WeekDay类型的枚举变量
        printf("%d\\n", sizeof(w));			//4,因为编译器会把枚举变量当做一个整型变量。
        printf("%d\\n", sizeof(sun));		//4,因为sizeof最终处理的就是数据的类型,sun是整型常量
        return 0;
    

  2. 声明枚举类型,同时定义枚举变量:后面照样可以定义其他枚举变量
    enum WeekDay  sun,mon,tue,wed,thu,fri,sat  w;

  3. 声明枚举类型时不写类型名,同时可以不定义枚举变量:
    以下两种写法都是可以的,因为我们不关系枚举变量,只关心里面的枚举元素
    enum  sun,mon,tue,wed,thu,fri,sat  w;
    enum  sun,mon,tue,wed,thu,fri,sat ;

5.没法通过枚举变量引用枚举元素,方法是直接使用枚举元素(测一下枚举元素的值、地址)

1、知识点:可以直接使用枚举元素,枚举元素的值取决于枚举类型声明时,系统的默认值 & 人为修改。

例1:
#include <stdio.h>
enum  sun,mon,tue,wed,thu,fri,sat ;
int main(int argc, char const *argv[])

    printf("%d\\n", sun);        //0,首个枚举元素默认值是0
    printf("%d\\n", mon);        //1,按照顺序,系统默认分配
    return 0;

==========================================================================================
例2:
#include <stdio.h>
enum  sun,mon,tue=9,wed,thu,fri,sat ;
int main(int argc, char const *argv[])

    printf("%d\\n", sun);        //0,首个枚举元素默认值是0
    printf("%d\\n", mon);        //1,声明枚举类型时,给中间某个枚举元素赋值,不会影响前面的元素
    printf("%d\\n", tue);        //9
    printf("%d\\n", wed);        //10,声明枚举类型时,给中间某个枚举元素赋值,会影响后面的元素
    return 0;

2、知识点:枚举元素和数组名虽然都是常量,但是有差别。枚举元素是符号常量,是右值;数组名是地址常量,是不可修改的左值。因此,不能对枚举元素取地址。同时,也不能给枚举元素赋值。

#include <stdio.h>
enum  sun,mon,tue,wed,thu,fri,sat ;
int main(int argc, char const *argv[])

    printf("%d\\n", &sun);				//错误,&运算符的表达式必须是左值或函数指示符
    mon = 2;        					//错误,赋值语句左边必须是可修改的左值
    return 0;

6.枚举变量就是整型变量

1、知识点:枚举变量允许用整型数据或字符数据初始化或赋值,因为编译器把枚举变量当做整型变量,但实际上不这么用,只用枚举元素给枚举变量赋值。

#include <stdio.h>
enum WeekDay  sun,mon,tue,wed,thu,fri,sat ;
int main(int argc, char const *argv[])
 
    enum WeekDay w;
    w = mon;
    printf("%d\\n", w);      //1,正常的用法
    w = 10;
    printf("%d\\n", w);      //10,不正常但可行的用法
    return 0;

C语言笔记-枚举类型

 
 1 //实现选择一个动物,输出一个叫声.
 2 #include <stdio.h>
 3 enum animal {Dog,Cat,Monkey,No};
 4 
 5 void dog()
 6 {
 7     puts("wang wang!");
 8 }
 9 void cat()
10 {
11     puts("miao miao!");
12 }
13 void monkey()
14 {
15     puts("zhi zhi!");
16 }
17 
18 enum animal choose(void)
19 {
20     //写法1:
21     int answer;//enum常量的数据类型都是int类型,所以可以设置int.
22     //enum animal answer;
23     do{
24         printf("选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.");
25         scanf("%d",&answer);
26     }while(answer<0 || answer>3);//本句可以写成}while(answer<Dog || answer>No);
27     return (enum animal)answer;//对应本函数的输出类型,在这儿进行强制转换,不然编译器会报错int类型的answer变量无法使用.
28     //return answer;
29     
30     /*写法2:
31     enum animal answer;//直接设置answer为enum answer类型,输出就不用进行类型转换了.
32     do{
33         printf("选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.");
34         scanf("%d",&answer);
35     }while(answer<0 || answer>3);
36     return answer;*/
37 }
38 
39 int main()
40 {
41     enum animal voice;//类似int a;
42     do
43     {
44         switch (voice=choose())//强制转换了choose的输出类型后这里才能使用
45         {
46             case Dog:
47                 {
48                     dog();
49                     break;
50                 }
51             case Cat:
52                 {
53                     cat();
54                     break;
55                 }
56             case Monkey:
57                 {
58                     monkey();
59                     break;
60                 }
61         }
62     }while(voice!=No);
63     return 0;
64 }

 

结果:

选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.0//我输入了0
wang wang!
选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.1//我输入了1
miao miao!
选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.2//我输入了2
zhi zhi!
选择一个动物: 0--狗, 1--猫, 2--猴, 3--不选择.3//我输入了3

--------------------------------
Process exited after 9.846 seconds with return value 0
请按任意键继续. . .

 

以上是关于C的实用笔记44——枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶学习笔记四自定义类型(枚举+联合)

C语言学习笔记(15)自定义类型:结构体,枚举,联合

C语言笔记

《你必须知道的495个C语言问题》读书笔记之第2章:结构联合和枚举

C语言的枚举类型知识

C语言中的枚举类型