c - C 编程中的枚举用户定义数据类型
问题描述
我正在研究用于定义枚举器列表的enum
ie 关键字,C
也称为枚举常量,编译器为其分配有符号整数值。
Syntax:
enum identifier (optional) { enumerator-list }
我正在玩弄enum
以了解编译器如何将整数分配给枚举列表中的枚举常量。
因此,当我使用以下方法编写 3 个不同的程序时enum
,我遇到了一些问题,这些问题附在下面的每个程序中。
程序一
#include <stdio.h>
#include <inttypes.h>
enum days_of_week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
int main(void) {
printf("%u %u %u %u %u %u %u\n", Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
return 0;
}
Output: 0 1 2 3 4 5 6
因为当没有为枚举常量显式分配整数时,编译器会自动根据zero-based indexing
.
程序-2
#include <stdio.h>
#include <inttypes.h>
enum days_of_week {Sunday, Monday, Tuesday = UINT16_MAX, Wednesday, Thursday, Friday, Saturday};
int main(void) {
printf("%u %u %u %u %u %u %u\n", Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
return 0;
}
Output: 0 1 65535 65536 65537 65538 65539
,正如我已经分配UINT16_MAX
给Tuesday
,在此之前,编译器在分配整数给枚举常量的基础上zero-based indexing
和之后Tuesday
分配整数给枚举常量,基于分配给其先前枚举常量 + 1 的整数。
程序-3
#include <stdio.h>
#include <inttypes.h>
enum days_of_week {Sunday, Monday, Tuesday = UINT32_MAX, Wednesday, Thursday, Friday, Saturday};
int main(void) {
printf("%u %u %u %u %u %u %u\n", Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
return 0;
}
gcc 7.4.0
编译器抛出的错误是,
enum_example_1.c:8:58: error: overflow in enumeration values
enum days_of_week {Sunday, Monday, Tuesday = UINT32_MAX, Wednesday, Thursday, Friday, Saturday};
由此,我得出结论,我可以分配给这些枚举常量的最大整数是,
UINT16_MAX
但我有一个问题,这个值是否依赖于编译器/系统?编译器在哪一步将这些整数值分配给这些枚举器,我的意思是编译器是在编译时还是运行时分配这些值?
使用enum
宏的优点是:
- 它增加了源代码的可读性。
- 范围规则适用于宏,
enum
但不适用于宏。 - 它自动将有符号整数初始化为枚举器列表中的枚举器常量/标签。
除了上面列出的优点之外, using 的其他优点是enum
什么,此外,在哪些用例中 usingenums
优于宏?
解决方案
我修改了程序 1以突出显示如何使用 a 进行enum
工作的更具体的编程技术local array
,如下所示:
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
enum days_of_week {Sunday = 3488, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
const char *getDayOfWeek(unsigned int day);
const char *getDayOfWeek(unsigned int day) {
static const char *days[7] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
day -= 3488;
day %= 7;
return days[day];
}
int main(void);
int main() {
static unsigned int day = (unsigned int) Thursday;
printf("%X %X %X %X %X %X %X\n", Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
if (day >= Sunday && day <= Saturday) {
printf("The day of week is: %s (or %X).\n", getDayOfWeek(day), day);
}
return 0;
}
推荐阅读
- c# - WPF 中的 User.config 单击一次应用程序在使用 RunAsAdmin 模式时保存在不同位置
- sql - 满足case条件时执行insert语句
- python - 为什么仍然给出类型错误?
- cytoscape.js - cytoscpae.js 的 cos-bilkent 布局扩展
- symfony - Symfony - 成功登录后保护身份验证器丢失用户
- c - 无法使用 C30 编译器复制 PIC24FJ256GB206 中的数组
- r - dput 的 row.names 与 rownames() 返回的不一致。为什么?
- apache-kafka - 卡夫卡 | 如何使用replica.high.watermark.checkpoint.interval.ms
- linux - 如何在 Shell 脚本中多次检查条件?
- php - 在 Laravel 应用程序中放置全局 php 的位置