图控大叔
构图传递思想
阅读从未如此简单!!!
01
前言
对于C语言里面的枚举类型,小编以前有听过,好像也用过,但是对于这块内容还是有一点点模糊。所以,今天想将枚举类型的相关知识点整理出来,内容如有不足或者存在纰漏,希望读者后台留言。
02
干货
枚举类型
关键字:enum
数据类型:整型(int)
所占内存:4字节(32位)
定义说明:
1、第一个枚举元素值在不赋值情况下,默认为0。
2、已经赋值的枚举元素,如果后面还有枚举元素未进行赋值,则默认在此基础上加一。但是,如果后面的枚举元素有进行赋值的情况下,则需要做其他说明。
使用场合:
当一个变量只有几种可能的值。
作用:
1、简单的连续打印
2、用作函数返回错误码(重点)
03
代码:定义与声明
方式一:类型定义与变量声明分开
enum num
{
a,b,c,d,e,f,g
//最后一个枚举元素后面无需加';',但是花括号需要
};
enum num N1;
enum num N2;
方式二:类型定义与变量声明一起
//第一种情况,包含标识符num
enum num
{
a,b,c,d,e,f,g
}N1;
//第二种情况,忽略标识符num
enum
{
a,b,c,d,e,f,g
}N1;
方式三:类型定义、变量声明与typedef
#include
typedef enum my_num_test
{
a,b,c,d,e,f,g
}num;
//此处的num为枚举型enum my_num_test的别名
num N1;
num N2;
int main(int argc,const char **argv){
N1 = g;
printf("%d\n",N1);
return 0;
}
/*
程序输出为:
6
*/
错误情况说明
1、存在同名的枚举类型变量(相同作用域情况下)
#include
enum num_1
{
a,b,c
}N1;
enum num_2
{
d,e,f,g
}N1;
int main(int argc,const char **argv){
return 0;
}
/*
报错提示:
11:2: error: conflicting types for ‘N1’
6:2: note: previous declaration of ‘N1’ was here
*/
2、存在同名的枚举元素(相同作用域情况下)
#include
enum num_1
{
a,b,c
}N1;
enum num_2
{
a,b,c
}N2;
int main(int argc,const char **argv){
return 0;
}
/*
报错提示:
10:2: error: redeclaration of enumerator ‘a’
5:2: note: previous definition of ‘a’ was here
10:4: error: redeclaration of enumerator ‘b’
5:4: note: previous definition of ‘b’ was here
10:6: error: redeclaration of enumerator ‘c’
5:6: note: previous definition of ‘c’ was here
*/
看到这里,你可能会想,如果是不同的作用域,那么同名可不可以呢?答案是可以的,但是小编想说,这样子不好,别给自己挖坑好吗?以下是不同作用域的程序代码
#include
enum num_1
{
a,b,c
}N1;
int main(int argc,const char **argv){
enum num_1
{
a,b,c
}N1;
return 0;
}
/*
此时枚举类型名、枚举元素、枚举变量名都一样,
但是程序没有报错,但是小编希望你不要瞎折腾
*/
04
代码:枚举元素值打印
#include
enum num
{
a,b=10,c
};
int main(int argc,const char **argv){
enum num N1;
N1 = a;
printf("%d\n",N1);
N1 = b;
printf("%d\n",N1);
N1 = c;
printf("%d\n",N1);
return 0;
}
/*
程序输出:
0
10
11
*/
05
代码:字节占用打印
#include
enum num
{
a,b,c
};
int main(int argc,const char **argv){
enum num N1;
printf("%d\n",sizeof(enum num));//此处需加关键字
printf("%d\n",sizeof(N1));
printf("%d\n",sizeof(a));
return 0;
}
/*
程序输出:
4
4
4
*/
06
问题讨论
1、枚举元素能否二次赋值?
答案:不能
#include
enum num
{
a,b,c
};
int main(int argc,const char **argv){
enum num N1;
a = 10;//二次赋值
N1 = a;
printf("%d\n",N1);
return 0;
}
/*
程序报错:
In function ‘main’:
12:5: error: lvalue required as left operand of assignment
*/
2、枚举元素能否遍历打印?
答案:简单可以,复杂不行,因为会乱
#include
enum num
{
a,b,c,d,f
};
/*
遍历打印:简单版
*/
int main(int argc,const char **argv){
enum num N1;
for(N1 = a;N1<=f;N1++)
{
printf("%d\n",N1);
}
return 0;
}
/*
程序输出:
0
1
2
3
4
*/
#include
enum num
{
a,b,c,d=8,f
};
/*
遍历打印:复杂版
*/
int main(int argc,const char **argv){
enum num N1;
for(N1 = a;N1<=f;N1++)
{
printf("%d\n",N1);
}
return 0;
}
/*
程序输出:
0
1
2
3
4
5
6
7
8
9
*/
3、什么是匿名枚举?(重点)
仅定义枚举类型但是没有声明枚举变量,但是其枚举元素仍可以在算术表达式中使用,代码如下:
#include
enum
{
one=1,
two=2,
three=3,
four=4
};
/*
匿名枚举示例
*/
int main(int argc,const char **argv){
int i = 10;
printf("%d\n",i);
i = i + three;
printf("%d\n",i);
return 0;
}
/*
程序输出:
10
13
*/
07
拓展
1、枚举类型和宏定义的区别?
2、编译器对于枚举类型和宏定义的处理是否一致?
(像老师一样留两个问题,嘿嘿!)
08
结尾
本次关于C语言中枚举类型的补充总结到这里就结束了,后期如果需要补充,再发!哈哈哈