枚举和二进制或运算符 (MISRA C++ 2008, 4-5-2)
Enums and binary or operator (MISRA C++ 2008, 4-5-2)
MISRA C++ 2008,4-5-2 指出:枚举类型的表达式不得用作除下标运算符 [ ]、赋值运算符 =、相等运算符 == 和以外的内置运算符的操作数!=、一元 & 运算符 和关系运算符 <、<=、>、>=。
如果可以使用&为什么不允许使用二进制 |用枚举?
你在做一个错误的比较。
一元 &
是 "address-of" 运算符,与 二元 &
"and" 运算符无关。
MISRA 规则禁止对枚举进行所有按位运算,但继续允许获取此类对象的地址。
正如在另一个答案中指出的那样,您混淆了 binary & 与 unary &.
不能使用二进制的原因 |和枚举上的其他按位运算符是枚举类型(枚举类型的变量)具有实现定义的大小和符号。并且枚举常量(枚举列表中的值)始终具有类型 signed int
.
在任何一种情况下,对有符号数使用任何形式的按位运算总是有问题的:您可能会得到意想不到的结果或调用定义不明确的行为。这是该规则旨在防止的主要问题。
MISRA 还以相同的理由禁止了常规算术:不要对您不知道其大小和符号的类型进行算术运算。不太可能导致错误,但我想如果你做像 enum { X=30000 }; ... X + X
这样奇怪的事情,它就有一个地方。这是明确定义的,还是对 int
的隐式提升,或者由于整数溢出而未定义?这可能是这两种情况之一,它不一定与 CPU 数据大小有关。
MISRA C++ 2008,4-5-2 指出:枚举类型的表达式不得用作除下标运算符 [ ]、赋值运算符 =、相等运算符 == 和以外的内置运算符的操作数!=、一元 & 运算符 和关系运算符 <、<=、>、>=。
如果可以使用&为什么不允许使用二进制 |用枚举?
你在做一个错误的比较。
一元 &
是 "address-of" 运算符,与 二元 &
"and" 运算符无关。
MISRA 规则禁止对枚举进行所有按位运算,但继续允许获取此类对象的地址。
正如在另一个答案中指出的那样,您混淆了 binary & 与 unary &.
不能使用二进制的原因 |和枚举上的其他按位运算符是枚举类型(枚举类型的变量)具有实现定义的大小和符号。并且枚举常量(枚举列表中的值)始终具有类型 signed int
.
在任何一种情况下,对有符号数使用任何形式的按位运算总是有问题的:您可能会得到意想不到的结果或调用定义不明确的行为。这是该规则旨在防止的主要问题。
MISRA 还以相同的理由禁止了常规算术:不要对您不知道其大小和符号的类型进行算术运算。不太可能导致错误,但我想如果你做像 enum { X=30000 }; ... X + X
这样奇怪的事情,它就有一个地方。这是明确定义的,还是对 int
的隐式提升,或者由于整数溢出而未定义?这可能是这两种情况之一,它不一定与 CPU 数据大小有关。