1

列挙型に複数の可能な値が含まれている場合、列挙型を変数と比較するにはどうすればよいですか?

例:次の列挙型の場合

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

私のように変数を比較すると、ifとifBOOL result = (a == EnumValueD)が得られます。NOint a = 0YESint a = -1

また、この列挙型はコンポーネント内にあるため、変更できません。

0この比較でとの両方に対してYESを返すにはどうすればよい-1ですか?

4

2 に答える 2

4

あなたの質問は誤解に基づいています。この線

EnumValueD = (0 | -1)

「複数の値」を示すものではありません。これは「ビット単位のor」演算子です。0とマイナス1の数値に対して(ビット単位の)演算を実行し、1つの答えだけを生成します。これは奇妙なコードですが(おそらく整数バイトサイズの問題に関係している可能性があります)、-1に対してテストするだけで済みます。(本当に安全になりたいのなら、テストすることができる(0|-1)と思います。)

||道徳:論理(またはビット単位)または演算子と混同しないでください|

于 2012-12-06T17:28:31.470 に答える
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;
于 2012-12-06T17:41:16.700 に答える