当前位置:网站首页>C:枚举的优缺

C:枚举的优缺

2022-08-10 16:31:00 风静如云

C语言可以通过两种方式定义常量:

1.#define宏定义

2.enum枚举定义

使用#define宏定义的缺点是,其属于预编译阶段常量,其名字会被预编译器替换为数值,这样在编译阶段,其名字已经不会再出现。

只用enum枚举定义,其名字在编译阶段依然是可见的。

定义枚举常量的方式为:

enum Color{red, green, blue};

其中枚举类型名Color是可选的。

没有为枚举常量设置值时,枚举类型中的第一个枚举常量的值为0,第二个为1,以此类推。

如果指定了枚举常量的值,那么后续枚举常量的值依次加1.

#include <stdio.h>

int main()
{
	enum Color{red, yellow, green=5, blue, white=1 };
	printf("%d %d %d %d %d\n", red, yellow, green, blue, white);
    return 0;
}

运行程序输出:

0 1 5 6 1

red,由于没有被设置值,因此默认值为0

yellow,基于red加1,值为1

green,被指定了值,值为5

blue,基于green加1,值为6

white,被指定了值,值为1

需要注意的是,枚举常量一旦被初始化后,其值是不能被更改的,也正因为如此才被称为枚举常量。

可以通过如下方式定义枚举变量:

#include <stdio.h>

int main()
{
	enum Color{red, yellow, green=5, blue, white=1 };
	enum Color c1 = green;
	enum Color c2 = (Color)9;    //不能直接用整数为枚举变量赋值
	printf("%d %d\n", c1, c2);
    return 0;
}

运行程序输出:

5 9

c1,枚举变量被定义为green,值为5

c2,枚举变量被定义了一个不存在的枚举值,值为9

另外需要注意的是,不能在同一个作用域内定义相同名字的枚举常量,即使这些常量位于不同的枚举类型名:

#include <stdio.h>

int main()
{
	enum Color{red, yellow, green=5, blue, white=8 };
	enum Wine{red, white};
	printf("%d %d %d\n", red, white, blue);
    return 0;
}

编译错误:
error: 'red' conflicts with a previous declaration
error: 'white' conflicts with a previous declaration

在不同的作用域内定义的枚举常量,相同名字的枚举常量会被掩盖:

#include <stdio.h>

enum Color{red, yellow, green=5, blue, white=8 };
int main()
{
	enum Wine{red, white};
	printf("%d %d %d\n", red, white, blue);
    return 0;
}

运行程序输出:

0 1 6

Wine内定义的red和white与Color定义的red和white具有相同的枚举常量名,但由于定义在不同的作用域内,因此Wine的局部作用域red和white掩盖了全局作用域内的Color的red和white

但是Wine没有定义blue,所以blue的值依然为全局作用域Color定义的枚举常量

通过以上几个程序可以看到,枚举在使用时有几点异于常规:

1.枚举的常量值,不需要通过其枚举常量名,可以直接使用

2.不同的枚举常量可以拥有相同的值

3.枚举变量可以被赋值一个不存在的枚举常量值

4.在相同作用域内的枚举名不能重复

对于这些不足,C++11引入了枚举类,可以更好的使用枚举

C++(11):枚举类_风静如云的博客-CSDN博客_c++ enum

原网站

版权声明
本文为[风静如云]所创,转载请带上原文链接,感谢
https://blog.csdn.net/jiemashizhen/article/details/126257469