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 
    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 
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 
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 
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 
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语言)