让我们来谈谈C语言中的enum
。
根据C标准(ISO/IEC 9899:201x),以下陈述是正确的:
定义枚举常量值的表达式应为整数常量表达式,其值可表示为int。
枚举数列表中的标识符被声明为具有int类型的常量,并且可以出现在允许的任何地方。127)枚举数=将其枚举常量定义为常量表达式的值。如果第一个枚举数具有no =,则其枚举常量的值为0。使用no =的每个后续枚举数都将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值。..。
如果在计算表达式过程中出现异常情况(即,如果结果不是数学定义的或不在其类型的可表示值范围内),则行为是未定义的。
类似于can an enum hold unsigned integers greater than INT_MAX?,我是否应该推断出以下内容是未定义的?
#include <limits.h>
enum {
x = INT_MAX,
y,
};
发布于 2019-12-30 17:46:29
该标准还规定:
每个带有
no=
的后续枚举数都将其枚举常量定义为通过将1
添加到前一个枚举常量的值而获得的常量表达式的值。
一个足够好的C编译器应该为您提供error: overflow in enumeration values
,所以您甚至不会通过编译阶段。
如果您这样做,您可能会删除该警告:
enum {
x = INT_MAX,
y = INT_MAX + 1,
};
无论如何,即使编译没有问题:是的,这是未定义的行为,因为您有符号整数溢出。
https://stackoverflow.com/questions/59534546
复制相似问题