【问题标题】:C# If not (this) Or (this) or (this) - Multiple condition IF/OR [duplicate]C# If not (this) Or (this) or (this) - 多个条件 IF/OR [重复]
【发布时间】:2017-01-27 13:35:27
【问题描述】:

我有这样的情况:

 if (!(InRange1 || InRange2 || InRange3))
{
//Do Something
}

每个 InRange 变量都是布尔值。

期望的行为是,如果这些值中的任何一个为 False,我想做某事,但它不是那样工作的。在触发事件之前,所有值都必须为 false。

是否需要写成

if (!InRange1 || !InRange2 || !InRange3)
{
//do something
}

而且,无论哪种情况,我都很好奇为什么原始语句不起作用。

【问题讨论】:

  • 你试过第二种方法了吗?它奏效了吗?如果它有效,那就是正确的方法。如果您没有尝试过,请尝试一下。最初的声明失败了,因为它完全按照它所说的:x = (a || b || c); return not x;。总是将复杂的表达式分解成单独的行,这样更容易让你理解。 (另一种选择是记住死去的逻辑学家的骆驼名字,这对你的时间没有好处)
  • 嗯,是的 - 你的第一个 sn-p 基本上是“找出其中任何一个是否为真,然后反转该结果”。理解为什么是非常重要的。看看表达式(InRange1 || InRange2 || InRange3)...你认为在各种情况下会产生什么结果?然后请记住,您正在使用 !... 反转它,但您正在反转整个结果。
  • 当你把!放在括号前面时,你说的是negate everything that is inside the parenthesis。因此,括号中的 true 变为 false,反之亦然。
  • 其他相关问题:Reverse the logic of two “or” statements in JavaScript if query(关于 JavaScript 但布尔逻辑相同)
  • 这些描述非常有道理。感谢您的澄清。

标签: c# if-statement multiple-conditions


【解决方案1】:

您可以为此使用DeMorgan's Law

你所拥有的就相当于 NOR。根据德摩根定律,!(A | B | C) 等价于 !A & !B & !C

你想要的是 NAND,所以!(A && B && C)。这完全等同于您正在寻找的 - !A | !B | !C

【讨论】:

  • 非常简洁的描述。谢谢。
  • @bairdmar 很高兴我能帮上忙
【解决方案2】:

你的第二个假设是正确的。

看看boolean algebraDe Morgan's law

你可以写not(A) OR not(B) or not(C),或者not(A AND B AND C)

所以

if (!(InRange1 && InRange2 && InRange3))
{
    //Do Something
}

if (!InRange1 || !InRange2 || InRange3)
{
    //Do Something
}

是等价的。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多