首页 > 解决方案 > C 编程中的枚举用户定义数据类型

问题描述

我正在研究用于定义枚举器列表的enumie 关键字,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_MAXTuesday,在此之前,编译器在分配整数给枚举常量的基础上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};

使用enum宏的优点是:

除了上面列出的优点之外, using 的其他优点是enum什么,此外,在哪些用例中 usingenums优于宏?

标签: cenums

解决方案


我修改了程序 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;
}

见链接:https ://ideone.com/IY39lR


推荐阅读