c#理解bool表达式

时间:2011-06-23 11:19:22

标签: c# boolean-logic

我确信这是一个非常简单的问题,但我无法弄清楚为什么这个断言失败了......

基本上如果IsApple是假的或者IsBannana是假的断言应该失败,但是如果其中一个是真的断言应该通过,那么有人可以解释为什么这个断言失败了吗?

        [Test]
        public void IsApplesOrBannans()
        {
            bool IsApple = true;
            bool IsBannana = false;

            if (!IsApple || !IsBannana)
                Assert.Fail();

            Assert.Pass();
        }

9 个答案:

答案 0 :(得分:5)

你所说的毫无意义。

以下是我(和编译器)理解你所说的内容:

  

基本上如果IsApple为false或IsBannana为false,则断言失败

  • 如果IsApple为false,则断言失败
  • 如果IsBanana为false,则断言失败

换句话说,如果其中一个是假的,你不关心另一个是否也是假的。

  

但是如果其中一个是真的断言应该通过

  • 如果其中一个是真的,那么不关心另一个是否也属实。

这些要求相互矛盾。

也许你的意思是“如果IsApple是假的 AND IsBanana是假的”;也就是说,如果它们为假。

但你写的是“如果IsApple是假的 OR IsBanana是假的”,也就是说,如果其中一个是假的。

答案 1 :(得分:4)

如果EITHER为false,则断言将失败,只有在BOTH为真时才会通过。

编辑:我会将其重写为:

if (IsApple || IsBanana)
{
    Assert.Pass();
}
else
{
    Assert.Fail();
}

有趣的是,提出的问题无法回答(因为如果一个是真的而另一个是假的,那么预期的结果是不明确的。)

答案 2 :(得分:4)

!IsBannana为真,因此if计算结果为真。

我打赌你想要:

if(!IsApple && !IsBananna)
    Assert.Fail();

答案 3 :(得分:1)

请改为:

if(!IsApple && !IsBannana)

答案 4 :(得分:0)

您的通过条件为IsApple || IsBannana,因此您的失败条件可写为:

if (!(IsApple || IsBannana))

或者你可以说两者都必须是假的失败:

if ((IsApple==false) && (IsBannana==false))

通常写成:

if (!IsApple && !IsBannana))

我个人认为这三种选择中的第一种是最好的。但这只是一种风格选择。在功能上它们是等价的。

甚至更好,您可以切换then的{​​{1}}和else部分:

if

甚至完全抛弃public void IsApplesOrBannans() { bool IsApple = true; bool IsBannana = false; if (IsApple || IsBannana) Assert.Pass(); else Assert.Fail(); } 声明:

if

答案 5 :(得分:0)

你的通过条件与你的失败条件相矛盾,因为如果只有一个是真的,那么另一个是假的,从而满足失败条件。

如果您希望它有意义,请将其更改为:

if (!IsApple && !IsBanana)
    Assert.Fail():

或者,如果您也不希望它同时成为苹果和香蕉

if (IsApple == IsBanana)
    Assert.Fail():

答案 6 :(得分:0)

(!A|| !A) = !!(!A || !B) = !(A && B) = !(true && false) --> false

答案 7 :(得分:0)

        if (IsApple != IsBannana)
            Assert.Fail();

我认为这个技巧!=是一个C#FAQ,因为穷人的XOR

答案 8 :(得分:0)

你不希望a和b都不是假的情况,或者至少有一个应该是真的,所以

   [Test]      
    public void IsApplesOrBannans() 
    {      
       bool IsApple = true;     
       bool IsBannana = false;    
       if (!(IsApple || IsBannana))   
            Assert.Fail();        
       Assert.Pass();       
    }