Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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 - Fatal编程技术网

C语言中枚举的大小

C语言中枚举的大小,c,C,如何知道枚举的大小天数?它是否等于7*4(sizeof(int))=28? 这里的printf()给了我值4,怎么解释呢 enum Days { saturday, sunday , monday , tuesday, wednesday, thursday, friday } TheDay; printf("%d", sizeof(enum Days)); 我们还可以

如何知道枚举的大小
天数
?它是否等于
7*4(sizeof(int))=28

这里的
printf()
给了我值
4
,怎么解释呢

enum Days            
{
    saturday,       
    sunday ,    
    monday ,       
    tuesday,
    wednesday,     
    thursday,
    friday
} TheDay;
printf("%d", sizeof(enum Days));

我们还可以将其用作(枚举天数)(0),这类似于整数数组。如果大小等于4,那么如何解释这种数组行为?

enum
通常大小为
int
。它是一种类型,而不是数组或结构,所以我不明白为什么您希望它是28。

它依赖于实现。枚举仅保证足够大以容纳整数值

参考资料:
C99标准6.7.2.2枚举说明符

约束
2定义枚举常量值的表达式应为整数 具有可表示为int的值的常量表达式。

4每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型选择由实现定义(128),但应能够表示枚举的所有成员的值。枚举类型在紧接着终止枚举器声明列表的}之后是不完整的,然后才完成


在C语言中,所有枚举大部分时间都是
int
类型的整数,这就解释了为什么
sizeof(Days)==4

要知道一个
枚举中有多少个值,可以执行以下操作:

enum Days            
{
    saturday,
    sunday,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday,
    NUM_DAYS
};
然后,
NUM_DAYS
将是
DAYS
中的枚举数

请注意,如果更改枚举的值,这将不起作用,例如:

enum Foo
{
    bar = 5,
    NUM_FOO
};

在上面的枚举中,
NUM_FOO
将是
6

在C中,枚举类型是实现定义的整数类型,可以表示枚举中的所有枚举常量

使用
gcc
如果枚举常量中没有负值,则实现定义的类型为
unsigned int
,否则为
int


枚举类型不应与枚举常量混淆。枚举常量的类型为
int

对于我现在使用的编译器,
sizeof(Enum)
取决于存储的最大值。如果所有的
enum
值都是
,那么您的答案就有疑问了,因为您大多数时候都说的是
int
*类型的整数。然而,精确的答案是大小是**imlpement定义的。实际上,大多数时候,
gcc
都是
unsigned int
+1,用于解释如何计算枚举中的项数,这是OP可能需要的。这有一个关于“枚举值未处理”的小警告流,例如,在切换枚举类型时(
enum Foo bar;switch(bar){}
。哪一个原因可以用一个空的案例来处理,还是合理的
默认值:
案例。真正的问题是为什么它是4而不是28,你没有回答。我认为约阿希姆的回答更切题,因为他解释了OP实际需要知道的内容。不,实际上,我解释了为什么我否决了你的答案。你可能是正确的你引用的答案中没有,但这不是OP需要或要求的。我根据你的评论更正了我的答案,请长大点,也这样做。@LittledV:我不会修改这个答案,因为它完全符合OP的要求。你应该再看一遍Q的要求。答案正好回答了这个问题,如果你看不到,那么就把它写下来投票只不过是恶意的报复性噪音。你必须纠正你的答案,因为它不正确。这个答案不会因为它正确而改变,我敢说任何人都会证明我不正确。对你的否决票感到高兴。除非你敢于证明这个答案不正确,否则我的对话就结束了。我实际上已经读过这个问题,并且OP显然需要解释什么是“枚举”是的。引用标准是没有帮助的。如果你不能理解这一点,我真的为你感到难过。我真的不明白为什么你不能真正地回应批评,而不是与批评作斗争。你让我读你的答案,所以我读了,并发表了我的意见。我可以澄清一点吗。枚举不能保证是大的虽然要保存整数值,它与整数值兼容。如果编译器选择使用一个字节来保存枚举,正如@Jonathan在上面指出的那样,而我的编译器这样做了,那么它可能与等价的整数值兼容,但不必太大而足以保存整数值。@LittledV我们可以使用(枚举天数)(0).所以我认为这是一个数组,因此doubt@abhi(枚举天数)(0)正在强制转换。数组索引标记为[],而不是()。