首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enum和二进制或运算符(MISRA C++ 2008,4-5-2)

Enum和二进制或运算符(MISRA C++ 2008,4-5-2)
EN

Stack Overflow用户
提问于 2020-06-15 12:47:18
回答 2查看 578关注 0票数 2

MISRA C++ 2008,4-5-2声明:除了下标运算符、赋值运算符=、相等运算符==和!=、一元运算符和!=、关系运算符<、<=、>、>=之外,不应使用带有枚举类型的表达式作为内建运算符的操作数。

如果一个人可以使用&为什么它不允许使用二进制的枚举?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 14:07:01

正如在另一个答案中所指出的,您将二进制和一元混合在一起。

您不能在枚举上使用二进制、取舍和其他按位运算符的原因是枚举类型(枚举类型的变量)具有实现定义的大小和签名性。枚举常量(枚举列表中的值)始终具有signed int类型。

在这两种情况下,对有符号数字使用任何形式的按位操作都是有问题的:您可以得到意外的结果,或者调用定义不好的行为。这是规则试图防止的主要问题。

MISRA也以同样的理由禁止常规算术:不要对你不知道大小和符号的类型做算术。不太可能引起but,但我想,如果您做一些像enum { X=30000 }; ... X + X这样的奇怪的事情,就会有一个地方可以使用它。这是定义良好的,还是对int的隐式提升,还是由于整数溢出而未定义?它可能是这两种情况中的任何一种,它不一定与CPU数据大小相关联。

票数 1
EN

Stack Overflow用户

发布于 2020-06-15 12:49:21

你在做错误的比较。

一元&是“地址-of”运算符,与二进制&和运算符无关。

MISRA规则禁止对枚举进行所有按位操作,同时继续允许获取此类对象的地址。

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

https://stackoverflow.com/questions/62388540

复制
相关文章

相似问题

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