MISRA C++2008,4-5-2规定:具有枚举类型的表达式不得用作内置运算符的操作数,下标运算符[],赋值运算符=,等式运算符==和!=,一元&; 运算符,以及关系运算符<,<=,>,>=。
如果可以使用&; 为什么不允许将二进制与枚举一起使用?
提前谢谢!
你在做一个错误的比较。
一元&
是“address-of”运算符,与二进制&
“and”运算符没有关系。
MISRA规则禁止对枚举进行所有按位操作,同时继续允许获取此类对象的地址。
正如在另一个答案中指出的,您混淆了二进制和; 使用一元&。
不能对枚举使用二进制运算符和其他按位运算符的原因是,枚举类型(枚举类型的变量)具有实现定义的大小和符号。 和枚举常量(枚举列表中的值)的类型总是signed int
。
在任何一种情况下,对有符号数字使用任何形式的按位操作总是有问题的:您可能会得到意外的结果,或者调用定义不佳的行为。 这是该规则力求防止的主要问题。
MISRA还禁止常规算术,理由也是一样的:不要对一个你不知道大小和签名的类型进行算术。 不太可能导致bug,但我猜如果您做一些奇怪的事情,比如enum{x=30000},它还是有用武之地的; 。。。X+X
。 这是定义良好的,还是对int
的隐式提升,或者是因为整数溢出而未定义的? 它可能是这两种情况中的任何一种,并且它不一定与CPU数据大小相联系。