给出以下代码:
enum Options
{
Surf = 0x01,
Out = 0x02
};
Options all = (Options) ( Surf | Out);
根据我的理解,Options只定义了两个变量。值0x03如何有意义?
答案 0 :(得分:7)
这个演员有问题吗?
没有
如果这个演员有意义,为什么呢?根据我的理解,Options只定义了两个变量,值0x03如何有意义?
枚举类型Options
有两个命名的枚举器,但它所代表的值范围足够大,可以用作包含每个枚举数的位域。
简而言之:是的,对于像这样的位域使用枚举是有效且定义良好的。
根据对此答案的评论的要求,允许这样的正式语言可以在C ++标准(C ++ 03 7.2 / 6)中找到:
对于 e min 是枚举最小的枚举, e max 是最大值,枚举的值是 b min 到 b max 范围内的基础类型的值,其中 b min 和 b max 分别是可存储的最小位字段的最小值和最大值< em> e min 和 e max 。
可以定义一个枚举,该枚举的值不是由任何枚举器定义的。
关于这是否是好风格存在争议。当然可以认为,通常假设枚举对象只能存储其枚举器之一,因此这样的代码可能会令人困惑且容易出错。
另一方面,我认为当枚举用作位域时通常很明显。通常这样的枚举以Options
或Flags
后缀或类似名称命名。同样,如果每个枚举器的设定值明显是单个设置位,则该枚举可能用作位域。
答案 1 :(得分:1)
Q1&GT;是。当你看起来想要一个位掩码时,你正在使用枚举。
Q2&GT;你是对的,没有意义。使用枚举意味着变量all将等于Options中的一个项目,而不是多个项目的组合或多个项目的组合。
答案 2 :(得分:0)
除了一些语法问题,您的代码确实有效。 但它有点俗气。枚举是整数,但是在样式方面,你应该坚持枚举中实际存在的值。
也许为bitwise-collection使用不同的int。 &安培;我猜是小心分配2的幂。如果你真的想要按位设置。
typedef enum Options
{
Surf = 0x01,
Out = 0x02
} Options;
答案 3 :(得分:0)
枚举只是int值的占位符,所以当你按位或它们得到这个:二进制(4位表示,所以对我来说更容易): 0001 | 0010 = 0011或3.枚举可以是任何值,甚至是完全无效的值。
答案 4 :(得分:0)
你可能会为enum
类型变量分配一个任意整数值,但它的风格很糟糕。与往常一样,代码首先是可读性,然后是编译器。期望枚举变量只能保存有效的枚举常量。
我会将最后一行更改为:
int all = ( Surf | Out);