-1

我有两个变量 spn 和 fmi。

(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

将这两部分翻译成代码,我们得到:

Spn 不是 3064

Spn != 3064


Fmi 不是 11 或 16

或以另一种方式表达,

Fmi 不是 11 且 Fmi 不是 16

 Fmi != 11 && Fmi != 16


现在使用上面我的项目符号列表中的 OR 将这两个放在一起,你会得到:

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 回答