-1

spn と fmi の 2 つの変数があります。

(3064,11),(3064,14),(3064,16),(123,11)

spn は最初の値 (3064,3064,3064,123) を取得し、fmi は (11,14,16,11) を取得します。

そしてここにコードがあります:

    if ((Spn != 3064) && (Fmi != 11) || (Fmi != 16))
    {
        Console.WriteLine("Spn:{0}  Fmi:{1}   Added", Spn, Fmi);
    }
    else
    {
        Console.WriteLine("Spn:{0}  Fmi:{1}   skipped", Spn, Fmi);
    }

だから私は出力を表示したい:

(3064,14) added
(123,11) added
(3064,16) skipped
(3064,11) skipped

上記のコードは間違っており、これは正しいものです:

 if ((Spn != 3064) || (Fmi != 11) && (Fmi != 16))

私は本当にそれを取得しません。それは私が以前に書いたものと正反対であり、正しいと期待されていました! 誰でも助けることができますか?

4

2 に答える 2

4

これは、C#の演算子の優先順位が原因で発生します。

&&よりも優先順位が高く||、最初に評価されます。

正しいバージョンでは、(Fmi != 11) && (Fmi != 16)最初に評価され、次にその OR の結果が評価されます(Spn != 3064)。(3064,14) と (123,11) のみが一致します。

あなたの間違ったバージョン(Spn != 3064) && (Fmi != 11)では、最初に評価され、その結果が OR に適用されます(Fmi != 16)。これは、(3064,14)、(3064,16)、および (123,11) に一致します。


選択が行われるようにするルールは、私にはあまり明確ではありません。与えられた回答を適用して、自分で決めてください.

何らかの優先順位を強制したい場合は、いくつかのグループを括弧( )で囲むことができます。

(A || B) && C

OR は AND の前に評価されます。

于 2014-03-12T12:25:12.630 に答える
3

出力例に基づいて、次の場合にアイテムをリストに追加したいようです。

  • Spn が 3064 または IF ではない
  • Fmi は 11 または 16 以外の何かです

これら 2 つの部分をコードに変換すると、次のようになります。

Spn は 3064 ではありません

Spn != 3064


Fmi は 11 または 16 以外の何かです

または別の言い方をすると、

Fmi は 11 ではなく、Fmi は 16 ではありません

 Fmi != 11 && Fmi != 16


上記の箇条書きリストの OR を使用してこれら 2 つを組み合わせると、次のようになります。

Spn != 3064 || (Fmi != 11 && Fmi != 16)


&&また、 よりも優先順位が高いため、必要に応じて括弧を削除できます||

Spn != 3064 || Fmi != 11 && Fmi != 16

そして、これはまさにあなた自身が機能することを発見した表現です.


何を追加するかではなく、何をスキップしたいかという観点からすべてをまとめた方が簡単かもしれません。言い換えると、

次の場合はペアをスキップします。

  • Spn は 3064 であり、かつ
  • Fmi は 11 または 16 です

そう

Spn == 3064 && (Fmi = 11 || Fmi == 16)

(今回は括弧が必要です)

if (Spn == 3064 && (Fmi = 11 || Fmi == 16))
{
    Console.WriteLine("Spn:{0}  Fmi:{1}   skipped", Spn, Fmi);
}
else
{
    Console.WriteLine("Spn:{0}  Fmi:{1}   Added", Spn, Fmi);
}
于 2014-03-12T12:28:56.020 に答える