枚举由一组命名整数常量组成。 枚举类型声明提供 (可选) 枚举标记的名称。 并且,它定义命名整数标识符集(称为 枚举集、 枚举器常量、 枚举器或 成员)。 枚举类型的变量存储该类型定义的枚举集的值之一。
类型的 enum 变量可用于索引表达式和所有算术和关系运算符的作数。 枚举提供了预处理器指令的替代 #define 方法,其优点是可以为你生成值并遵守正常的范围规则。
在 ANSI C 中,定义枚举器常量值的表达式始终具有 int 类型。 这意味着与枚举变量关联的存储是单个 int 值所需的存储。 在 C 语言允许整数表达式的任何位置使用枚举常量或枚举类型的值。
语法
enum-specifier:
enum
identifier
选择{enumerator-list}
enum
identifier
enumerator-list:
enumerator
enumerator-list
,
enumerator
enumerator:
enumeration-constant
enumeration-constant
=
constant-expression
enumeration-constant:
identifier
枚举类型定义的enumerator-list可选identifier名称。 此标识符通常称为列表指定的枚举的“标记”。 类型说明符声明 identifier 为非确定性指定的枚举的 enumerator-list 标记,如下所示:
enum identifier
{
// enumerator-list
}
定义 enumerator-list 枚举集的成员。
如果标记的声明可见,则以后使用标记但省略 enumerator-list 的声明指定以前声明的枚举类型。 该标记必须引用定义的枚举类型,并且该枚举类型必须位于当前范围内。 由于枚举类型是在其他地方定义的, enumerator-list 因此此声明中不会显示该类型。 从枚举类型和 typedef 枚举类型声明派生的类型声明可以在定义枚举类型之前使用枚举标记。
每个 enumeration-constant 名称中 enumerator-list 都有一个枚举集的值。 默认情况下,第一个 enumeration-constant 值与值 0 相关联。 列表中的下一个 enumeration-constant 值与值 ( constant-expression + 1) 相关联,除非显式将其与另一个值相关联。 名称 enumeration-constant 等效于其值。
可用于 enumeration-constant = constant-expression 替代默认值序列。 也就是说,如果 enumeration-constant = constant-expression 出现在其中 enumerator-list,则 enumeration-constant 与给定 constant-expression的值相关联。 必须 constant-expression 具有 int 类型,并且可以是负数。
以下规则适用于枚举集的成员:
枚举集可以包含重复的常量值。 例如,可以将值 0 与两个不同的标识符(例如,同一集中命名
null的成员和zero成员)相关联。枚举列表中的标识符必须与具有相同可见性的同一作用域中的其他标识符不同。 这包括其他枚举列表中的普通变量名称和标识符。
枚举标记遵循正常的范围规则。 它们必须与具有相同可见性的其他枚举、结构和联合标记不同。
例子
这些示例说明了枚举声明:
enum DAY /* Defines an enumeration type */
{
saturday, /* Names day and declares a */
sunday = 0, /* variable named workday with */
monday, /* that type */
tuesday,
wednesday, /* wednesday is associated with 3 */
thursday,
friday
} workday;
值 0 默认与saturday 标识符 sunday 显式设置为 0。 其余标识符默认为值 1 到 5。
在此示例中,将集中 DAY 的值赋给变量 today。
enum DAY today = wednesday;
枚举常量的名称用于赋值。
DAY由于枚举类型以前已声明,因此只需要枚举标记DAY。
若要将整数值显式分配给枚举数据类型的变量,请使用类型强制转换:
workday = ( enum DAY ) ( day_value - 1 );
建议在 C 中使用此强制转换,但不是必需的。
enum BOOLEAN /* Declares an enumeration data type called BOOLEAN */
{
false, /* false = 0, true = 1 */
true
};
enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */
此声明也可以指定为
enum BOOLEAN { false, true } end_flag, match_flag;
或 as
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
使用这些变量的示例可能如下所示:
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
还可以声明未命名的枚举器数据类型。 省略数据类型的名称,但可以声明变量。 该变量 response 是定义的类型的变量:
enum { yes, no } response;