允许枚举的标识符有什么意义?

Lon*_*ner 10 c enums

当我尝试将不正确的值分配给a类型变量时,为什么编译器不抱怨enum answer

#include <stdio.h>

int main()
{
    enum answer {NO, YES};
    enum gender {MALE, FEMALE};

    enum answer a = 5; /* Assign an invalid value. */
    printf("answer: %d\n", a);

    a = MALE; /* Assign a value of wrong type */
    printf("answer: %d\n", a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ gcc -std=c99 -pedantic -Wall -Wextra enum.c 
$ ./a.out
answer: 5
answer: 0
Run Code Online (Sandbox Code Playgroud)

如果enum不导致类型检查,那么将语法设置为:

enum [identifier] {enumerator-list}
Run Code Online (Sandbox Code Playgroud)

我使用answergender作为我的枚举的标识符.允许这种语法有什么意义?

我的意思是这段代码写得非常好

enum {NO, YES};
enum {MALE, FEMALE};
Run Code Online (Sandbox Code Playgroud)

允许这种语法有什么意义?

enum answer {NO, YES};
enum gender {MALE, FEMALE};
Run Code Online (Sandbox Code Playgroud)

Mic*_*rny 7

当我尝试将不正确的值分配给a类型变量时,为什么编译器不抱怨enum answer

因为在C中,a enum实际上相当于a int.它像它一样被标准化,并且太多的程序依赖于这种行为来改变它.

在C++中,它们是不同的类型,编译器抱怨:

$ g++ -Wall -Wextra a.c
a.c: In function 'int main()':
a.c:8:24: error: invalid conversion from 'int' to 'main()::answer' [-fpermissive]
a.c:11:14: error: cannot convert 'main()::gender' to 'main()::answer' in assignment
Run Code Online (Sandbox Code Playgroud)

允许这种语法有什么意义?

我的快速猜测是前向兼容性.