为什么枚举对象可以具有除C中的枚举数之外的值?

时间:2016-01-27 08:53:18

标签: c

这是我的代码:

#include <stdio.h>
int main()
{   
    enum C {green = 5, red};
    enum CC {blue, yellow} cc = green;
    printf("%i\n", cc);
    return 0;
}

它编译并生成控制台输出5.

cppreference.com表示“枚举类型是一种不同的类型,其值仅限于几个显式命名的常量之一(枚举常量)”。我真的很困惑。

顺便说一句,我使用的编译器是gcc版本4.8.1。

4 个答案:

答案 0 :(得分:4)

您正在阅读C ++文档以了解C? C和C ++ 不是相同的语言。

在C中,btStop实际上是一个整数类型,您可以这样处理它。这意味着您可以为其分配一个整数,该整数可能不是规定值之一。

然而,这被认为是不好的做法,而且一些编译器或静态代码检查器可以选择警告这些做法。

另一方面,在C ++中,枚举本身就是不同的类型,你不能在C ++中这样做,至少不是隐式的。将其编译为C ++会导致编译错误。

答案 1 :(得分:3)

从std 6.7.2.3(枚举内容) - enum的基础类型是实现定义的,但类型enum的变量可以分配任意数量的基础类型(在至少char)。

  

每个枚举类型应与char,有符号整数类型或者   无符号整数类型。 类型的选择是实现定义的,但应该是   能够表示枚举的所有成员的值。该   枚举类型是不完整的,直到终止列表的}之后   枚举器声明,然后完成。

编译器不需要检查enum变量中的商店是否是该枚举的有效值。

答案 2 :(得分:2)

是的,C编译器允许你这样做。

你也可以这样做:

#include <stdio.h>

int main()
{   
    enum C {green = 5, red};
    enum C  cc = 7;
    printf("%i\n", cc);

    return 0;
}

CPP与C非常不同,因此不要将CPP引用应用于C.

答案 3 :(得分:0)

在C中存在矛盾。所有枚举都是不同的类型。但是它们的枚举器是int类型的整数常量。

没有检查给定的整数值是否对应于枚举中指定的枚举数集。

在C ++中,矛盾被消除了。在C ++中,每个枚举器都与枚举的枚举类型相同,而且没有从类型int到给定枚举类型的隐式转换。