布尔逻辑-c#理解布尔表达式
本文关键字:布尔表达式 -c# 布尔逻 | 更新日期: 2023-09-27 18:00:15
我确信这是一个非常简单的问题,但我不明白为什么这个断言失败。。。
基本上,如果IsApple是假的或IsBannana是假的断言应该失败,但是如果两个断言中的一个是真的断言应该通过,有人能解释为什么这个断言失败吗?
[Test]
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (!IsApple || !IsBannana)
Assert.Fail();
Assert.Pass();
}
你所说的毫无意义。
以下是我(和编译器)如何理解你的意思:
基本上,如果IsApple是错误的,或者IsBannana是错误的断言应该失败
- 如果IsApple是错误的,那么断言应该失败
- 如果IsBanana为false,则断言应该失败
换句话说,如果其中一个是假的,那么就不在乎另一个是否也是假的。
但是,如果其中一个是真的,断言应该通过
- 如果其中一个是真的,你就不在乎另一个是否也是真的
这些要求相互矛盾。
也许你的意思是"如果IsApple是假的和IsBanana是假的";也就是说,如果它们都为false。
但你写的是"如果IsApple是假的或IsBanana是假的",也就是说,如果其中一个是假的。
!IsBannana
为true,因此if的计算结果为true。
我打赌你想要:
if(!IsApple && !IsBananna)
Assert.Fail();
如果EITHER为false,断言将失败,只有当BOTH为true时,断言才会通过。
编辑:我会重新写为:
if (IsApple || IsBanana)
{
Assert.Pass();
}
else
{
Assert.Fail();
}
有趣的是,所提出的问题是无法回答的(因为根据问题,如果一个是真的,另一个是假的,那么预期的结果是模糊的)。
改为执行以下操作:
if(!IsApple && !IsBannana)
if (IsApple != IsBannana)
Assert.Fail();
我认为这个技巧!=
是一个C#常见问题,因为穷人的XOR
您不希望出现a和b都不为假,或者至少有一个为真的情况,因此
[Test]
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (!(IsApple || IsBannana))
Assert.Fail();
Assert.Pass();
}
您的通过条件是IsApple || IsBannana
,因此您的失败条件可以写成:
if (!(IsApple || IsBannana))
或者,你可以说两者都必须是假的才能失败:
if ((IsApple==false) && (IsBannana==false))
通常写为:
if (!IsApple && !IsBannana))
就我个人而言,我认为这三种选择中的第一种是最好的。但这只是一种风格上的选择。它们在功能上是等效的。
或者更好的是,您可以切换if
:的then
和else
部分
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
if (IsApple || IsBannana)
Assert.Pass();
else
Assert.Fail();
}
甚至完全抛出if
语句:
public void IsApplesOrBannans()
{
bool IsApple = true;
bool IsBannana = false;
Assert.IsTrue(IsApple || IsBannana);
}
您的通过条件与失败条件相矛盾,因为如果只有一个为true,则另一个为false,从而满足失败条件。
如果你想让它有意义,就把它改成这个:
if (!IsApple && !IsBanana)
Assert.Fail():
或者,如果你也不想它同时是一个苹果和香蕉
if (IsApple == IsBanana)
Assert.Fail():
(!A|| !A) = !!(!A || !B) = !(A && B) = !(true && false) --> false