提问者:小点点

枚举和二进制or运算符(MISRA C++2008,4-5-2)


MISRA C++2008,4-5-2规定:具有枚举类型的表达式不得用作内置运算符的操作数,下标运算符[],赋值运算符=,等式运算符==和!=,一元&; 运算符,以及关系运算符<,<=,>,>=。

如果可以使用&; 为什么不允许将二进制与枚举一起使用?

提前谢谢!


共2个答案

匿名用户

你在做一个错误的比较。

一元&是“address-of”运算符,与二进制&“and”运算符没有关系。

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

匿名用户

正如在另一个答案中指出的,您混淆了二进制和; 使用一元&。

不能对枚举使用二进制运算符和其他按位运算符的原因是,枚举类型(枚举类型的变量)具有实现定义的大小和符号。 和枚举常量(枚举列表中的值)的类型总是signed int

在任何一种情况下,对有符号数字使用任何形式的按位操作总是有问题的:您可能会得到意外的结果,或者调用定义不佳的行为。 这是该规则力求防止的主要问题。

MISRA还禁止常规算术,理由也是一样的:不要对一个你不知道大小和签名的类型进行算术。 不太可能导致bug,但我猜如果您做一些奇怪的事情,比如enum{x=30000},它还是有用武之地的; 。。。X+X。 这是定义良好的,还是对int的隐式提升,或者是因为整数溢出而未定义的? 它可能是这两种情况中的任何一种,并且它不一定与CPU数据大小相联系。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(枚举|二进制|运算符|misra|c++2008|4-5-2)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?