【问题标题】:comparing enum with multiple values and no bitwise [closed]将枚举与多个值进行比较并且没有按位[关闭]
【发布时间】:2012-12-06 17:24:33
【问题描述】:

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

例如:对于以下枚举

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

当比较像BOOL result = (a == EnumValueD) 这样的变量时,如果int a = 0 我得到NO,如果int a = -1 得到YES

另外,这个枚举在一个组件中,所以我不能改变它..如何

如何让0-1 的比较返回YES?

【问题讨论】:

    标签: objective-c c enums comparison


    【解决方案1】:

    您的问题是基于误解。线

    EnumValueD = (0 | -1)
    

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

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

    【讨论】:

    • 我犯了一个多么愚蠢的错误...感谢指出!
    【解决方案2】:

    让它变成这样:

    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;
    

    【讨论】:

    • 感谢您的关注,但我认为您并没有完全阅读这个问题,第一次我写了this enum is inside a component so I just can't change it,特别是标题,上面写着no bitwise
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2013-08-28
    相关资源
    最近更新 更多