比较枚举与多个值,没有按位

时间:2012-12-06 17:24:33

标签: objective-c c enums comparison

如果枚举包含多个可能的值,如何将枚举与变量进行比较?

例如:以下枚举

typedef enum {
    EnumValueA = 2,
    EnumValueB = 3,
    EnumValueC = 4,
    EnumValueD = (0 | -1)
} EnumValues;

在比较BOOL result = (a == EnumValueD)之类的变量时,如果NO,我会获得int a = 0YES会获得int a = -1

此外,这个枚举是在一个组件内,所以我无法改变它..如何

如何对0-1

进行此比较返回YES

2 个答案:

答案 0 :(得分:4)

你的问题是基于一种误解。这条线

EnumValueD = (0 | -1)

表示“多个值”。这是一个“按位或”运算符:它对数字0和减1执行一个操作(按位),并产生一个答案。这是一个奇怪的代码(可能与整数字节大小问题有关),但你只需要测试-1。 (如果你真的想要安全,你可以对(0|-1)进行测试,我想。)

道德:不要将逻辑 - 或||与按位或运算符|混淆。

答案 1 :(得分:0)

让它像这样:

typedef enum {
    EnumValueA = 1,
    EnumValueB = 2,
    EnumValueC = 4,
    EnumValueD = 8
} EnumValues;

因此,您可以使用逻辑或组合一个值,以便可以有多个值 然后使用逻辑检查是否包含单个值 例如:

EnumValues val= EnumValueD | EnumValueC;

然后读取值:

if(value & EnumValueA)
    actionA();
if(value & EnumValueB)
    actionB();
if(value & enumValueC)
    actionC();
if(value & enumValueD)
    actionD();

因此,如果有多个值,将执行多个操作。 如果需要,还可以放置包含多个值的值,而不是使用或:

typedef enum {
    EnumValueA = 1,
    EnumValueB = 2,
    EnumValueC = 4,
    EnumValueD = 8,
    EnumValueCAndD= 12
} EnumValues;