布尔逻辑-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();
        }

布尔逻辑-c#理解布尔表达式

你所说的毫无意义。

以下是我(和编译器)如何理解你的意思:

基本上,如果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:的thenelse部分

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