首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >声明中未定义的行为

声明中未定义的行为
EN

Stack Overflow用户
提问于 2019-12-30 17:22:12
回答 1查看 92关注 0票数 9

让我们来谈谈C语言中的enum

根据C标准(ISO/IEC 9899:201x),以下陈述是正确的:

  • §6.7.2.2:

定义枚举常量值的表达式应为整数常量表达式,其值可表示为int。

枚举数列表中的标识符被声明为具有int类型的常量,并且可以出现在允许的任何地方。127)枚举数=将其枚举常量定义为常量表达式的值。如果第一个枚举数具有no =,则其枚举常量的值为0。使用no =的每个后续枚举数都将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值。..。

  • §6.5:

如果在计算表达式过程中出现异常情况(即,如果结果不是数学定义的或不在其类型的可表示值范围内),则行为是未定义的。

类似于can an enum hold unsigned integers greater than INT_MAX?,我是否应该推断出以下内容是未定义的?

代码语言:javascript
运行
复制
#include <limits.h>
enum {
   x = INT_MAX,
   y,
};
EN

回答 1

Stack Overflow用户

发布于 2019-12-30 17:46:29

该标准还规定:

每个带有no=的后续枚举数都将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值。

一个足够好的C编译器应该为您提供error: overflow in enumeration values,所以您甚至不会通过编译阶段。

如果您这样做,您可能会删除该警告:

代码语言:javascript
运行
复制
enum {
   x = INT_MAX,
   y = INT_MAX + 1,
};

无论如何,即使编译没有问题:是的,这是未定义的行为,因为您有符号整数溢出。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59534546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档