算子表现为奇数
本文关键字: | 更新日期: 2023-09-27 17:50:00
我有两个变量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))
我真的不明白。这与我之前写的完全相反,我希望它是正确的!有人能帮忙吗?
这是因为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之前求值。
根据您的示例输出,听起来您想在列表中添加一个项目,如果:
- 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 AND
- 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);
}