0

2 つの列挙型をチェックしたいのですが、うまくいきません。私は次のものを持っています:

typedef enum {
    ZSSegmentTypeE,
    ZSSegmentTypeS,
    ZSSegmentTypeO,
    ZSSegmentTypeD,
    ZSSegmentTypeN
} ZSSegmentType;

次の作品:

if (someSegmentType != ZSSegmentTypeN) {
    // Works
}

以下は機能しません:

if (someSegmentType != ZSSegmentTypeN || someSegmentType != ZSSegmentTypeD) {
     // Does NOT work
}

2 つの異なる列挙型をテストしているこの 2 番目の例が機能しないのはなぜですか? 列挙型と比較がどのように機能するかを理解する上で何が欠けていますか?

4

2 に答える 2

5

ド・モルガンの法則は、次のことを示しています。

someSegmentType != ZSSegmentTypeN || someSegmentType != ZSSegmentTypeD

これと同じです:

!(someSegmentType == ZSSegmentTypeN && someSegmentType == ZSSegmentTypeD)

同時にsomeSegmentType両方ZSSegmentTypeN はないことはご理解いただけると思います。ZSSegmentTypeDしたがって、括弧内の式は常に false になり、ステートメント全体が true になります。

おそらくテストしたいのは、変数がこれら2つの値のどちらでもないかどうかです。次のようにします。

someSegmentType != ZSSegmentTypeN && someSegmentType != ZSSegmentTypeD
于 2012-10-11T23:19:49.647 に答える
2

someSegmentType が 2 つの値のどちらでもない場合にのみ 2 番目の if ステートメントが成功すると仮定すると、|| ではなく && が必要になります。

于 2012-10-11T23:15:07.360 に答える