C的实用笔记44——枚举类型
Posted lzh201864031
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C的实用笔记44——枚举类型相关的知识,希望对你有一定的参考价值。
1.枚举变量就是符号常量(枚举常量)的集合
2.枚举变量的四要素
与普通变量的四要素完全相同。
1、枚举类型变量的类型:也就是枚举类型,它是我们自创的类型,也是构造类型。它的声明通常不放在函数中,书写的方式就像全局变量,因为它要尽可能让程序中的所有位置都能使用这个类型声明。枚举类型的声明又有三部分:
- enum关键字:表示构造的是枚举类型。
- 枚举类型名:和结构体一样,编程习惯是用大写开头,小写开头虽然不出错,就是看起来太low了。
- 枚举元素列表:枚举元素就是符号常量,且是整型常量(包括整型数和字符)。枚举元素之间用逗号隔开,最后一个枚举元素后面可以加逗号也可以不加逗号,可以给枚举元素赋值。枚举元素写成一行就行了。如果没有给给枚举元素赋值,那么枚举元素的值默认从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、枚举类型的知识点:
- 枚举类型声明时,末尾加分号;
- 同一个枚举类型中,枚举元素不能重名。
同一个枚举类型中,不允许有枚举元素重名 enum WeekDay sun,mon,tue,wed,tue,fri,sat ;
- 两个不同的枚举类型,它们里面的枚举元素也不能重名。
尽管枚举元素在不同的枚举类型中,但是由于枚举元素实际上就是符号常量,因此不能重名 enum WeekDay sun,mon,tue,wed,thu,fri,sat ; enum Weekend sat,sun ;
- 枚举类型这个构造类型,决定了枚举变量占用空间的大小,系统会在程序运行或编译阶段给你静态分配好内存。可以肯定的是:枚举类型占用4个字节的空间,因为枚举元素只允许是整型常量表达式,而编译器会认为枚举变量就是一个整型变量。
- 与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、知识点:定义的方式和结构体和共用体很像,都有三种,考虑到我们不关心枚举变量,用哪种都无所谓。
- 枚举类型声明和枚举变量定义分开写。
#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;
- 声明枚举类型,同时定义枚举变量:后面照样可以定义其他枚举变量
enum WeekDay sun,mon,tue,wed,thu,fri,sat w;
- 声明枚举类型时不写类型名,同时可以不定义枚举变量:
以下两种写法都是可以的,因为我们不关系枚举变量,只关心里面的枚举元素 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——枚举类型的主要内容,如果未能解决你的问题,请参考以下文章