Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 允许枚举的标识符有什么意义?_C_Enums - Fatal编程技术网

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

C 允许枚举的标识符有什么意义?,c,enums,C,Enums,当我试图给enum answer类型的变量a赋值时,编译器为什么不抱怨 #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 val

当我试图给
enum answer
类型的变量
a
赋值时,编译器为什么不抱怨

#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;
}
如果
enum
不会导致类型检查,那么将语法设置为:

enum [identifier] {enumerator-list}
我使用
answer
gender
作为枚举的标识符。允许这种语法有什么意义

enum answer {NO, YES};
enum gender {MALE, FEMALE};
我的意思是这段代码可以写得很好

enum {NO, YES};
enum {MALE, FEMALE};
允许这种语法有什么意义

enum answer {NO, YES};
enum gender {MALE, FEMALE};
当我试图给
enum answer
类型的变量
a
赋值时,编译器为什么不抱怨

#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;
}
因为在C中,
enum
实际上等同于
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
允许这种语法有什么意义

enum answer {NO, YES};
enum gender {MALE, FEMALE};

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

C将<>代码>枚举< /C>值直接作为整数,而在C++ <代码>枚举< /COD>中是一个真实类型。因此,C++中的代码> EnUM <代码>导致类型检查,而在C枚举中仅表示int类型的常量。因此,整数和枚举值可以在所有算术运算中混合。

< P>假设:

enum answer {NO, YES};

enum gender {MALE, FEMALE};
与:

虽然C标准没有要求,但它允许实现在以下情况下发出警告:

bla = blop;

bip =  bla;
请注意,
enum
类型是算术类型,始终允许在不同算术类型的对象之间赋值,但实现仍然可以自由发出警告。正如一些评论所说的,对于C++,规则<>代码>枚举< /Cord>类型是不同的。 编辑:另一个示例:

enum ans {
    YES,
    NO,
    MAYBE
};


enum ans a = /* initializer */;

switch (a)
{
    case YES:
        break;
    case NO:
        break;
}
使用
-Wall
(即
-Wswitch
),
gcc
能够警告:

tst.c:15:5:警告:枚举值“MAYBE”未在开关中处理

如果你有:

enum {
    YES,
    NO,
    MAYBE
};

int a = /* initializer */;

gcc
将无法发出警告。因此,实际上使用
enum
类型而不是仅使用
enum
常量有助于静态分析器工具。

这是一个警告,而不是错误,至少在C++99clang中,如果为“分配错误类型的值”行启用了
-Wconversion
,则会发出警告。