MISRA C++ 2008,4-5-2声明:除了下标运算符、赋值运算符=、相等运算符==和!=、一元运算符和!=、关系运算符<、<=、>、>=之外,不应使用带有枚举类型的表达式作为内建运算符的操作数。
如果一个人可以使用&为什么它不允许使用二进制的枚举?
发布于 2020-06-15 14:07:01
正如在另一个答案中所指出的,您将二进制和一元混合在一起。
您不能在枚举上使用二进制、取舍和其他按位运算符的原因是枚举类型(枚举类型的变量)具有实现定义的大小和签名性。枚举常量(枚举列表中的值)始终具有signed int类型。
在这两种情况下,对有符号数字使用任何形式的按位操作都是有问题的:您可以得到意外的结果,或者调用定义不好的行为。这是规则试图防止的主要问题。
MISRA也以同样的理由禁止常规算术:不要对你不知道大小和符号的类型做算术。不太可能引起but,但我想,如果您做一些像enum { X=30000 }; ... X + X这样的奇怪的事情,就会有一个地方可以使用它。这是定义良好的,还是对int的隐式提升,还是由于整数溢出而未定义?它可能是这两种情况中的任何一种,它不一定与CPU数据大小相关联。
发布于 2020-06-15 12:49:21
你在做错误的比较。
一元&是“地址-of”运算符,与二进制&和运算符无关。
MISRA规则禁止对枚举进行所有按位操作,同时继续允许获取此类对象的地址。
https://stackoverflow.com/questions/62388540
复制相似问题