【问题标题】:checking for both true or both false检查两个真或两个假
【发布时间】:2013-12-11 02:29:20
【问题描述】:

如果我有以下逻辑来检查两个真或两个假但忽略其他的,我写:

if (a) {
  if (b) {
    // do something when both true
  }
} else if (!b) {
  // do something when both false
}

这是你用java写的最简单的吗?

我当然会写

if (a && b) {
    // do something when both true
} else if (!a && !b) {
  // do something when both false
}

但我在想是否有可能只使用一个 if 条件和 else 没有条件来实现这一点,例如

if (some condition) {
    // do something when both true
} else {  // <-- check! only else, no more condition
  // do something when both false
}

不可能当然是这个问题的可接受答案(如果附有解释)

谢谢

【问题讨论】:

    标签: java comparison logic


    【解决方案1】:

    为我最初的 XOR 答案道歉 - 我误读了您的问题。正确答案是,

    在 Java 中是不可能的。

    原因是布尔逻辑之一。当你有两个逻辑,A 和 B,那么就有四种可能的状态:

    A  B
    0  0    << A and B are false
    0  1
    1  0
    1  1    << A and B are true
    

    当你有一个条件说“A 和 B 都为真”时,你只有最后一个状态。不幸的是,“else”(所有其他)包含三种可能的状态。你不能拥有对一种状态为真、对另一种状态为假、而另两种状态为“其他”的东西。这不是布尔代数的工作原理。

    【讨论】:

    • 不,我需要两者都是 TRUE,然后都是 FALSE
    • 那么无论我能写出多么复杂的第一个if条件,都没有办法通过一个简单的else过滤掉其他的吗?
    • 确实——因为第一个条件只能对四种可能的状态之一为真,而所有其他状态都传递给else。没有解决这个问题。
    • @user1589188 if (x) { .. } else { .. } 在语义上等价于 if (x) { .. } else if (!x) { .. } (但不要这样写!)其中表达式 x 没有副作用(并且没有进一步的条件链接)。
    • 抱歉在 2015 年发布,但在 Java 中不可能进行双重比较?据我了解,OP 希望 ab 都是 false 或两者都是 true。所以true+true 为真,false+false 为真,true+false 反之亦然false。在这种情况下,在 Java 中,我可以做类似(a == expectedA) == (b == expectedB) 的事情,不是吗? 说明:如果第一个比较结果与第二个比较结果匹配,则验证。
    【解决方案2】:

    答案是。不使用else if,您不能拥有仅在特定条件下运行的else 子句。每次if 子句中的条件为假时,不带else ifelse 子句将运行。如果你想添加额外的约束(比如ab都是假的)你需要使用else if

    不过,使用else if 并没有错,而且它让你的意图相当明确:

    if (a && b) {
    
    } else if (!a && !b) {
    
    }
    

    【讨论】:

    • +1 用于解释。我认为这是最简单/清晰的方法。我会使用它变体:if (a &amp;&amp; b) { .. } else if (!(a || b)) { .. },这取决于我认为对于给定情况更清楚的情况..但它也与原始帖子中给出的相同。
    【解决方案3】:

    您希望以不同的方式处理三种状态——尽管一种情况是“什么也不做”。

    if ( a && b )
    {
        // Do something when both are true.
    }
    else if ( ! a && ! b )
    {
        // Do something if both are false.
    }
    

    这是实现您想要实现的目标的最经济的方法——三个案例的两个测试。

    或者,如果您可以从“布尔值”或表达式中返回 0 或 1,您可以执行以下操作:

    switch ( a + b )
    {
        case 0:
            // Do something when both a and b are "false."
            break;
    
        case 1:
            // Do something -- or nothing -- when a or b are "false" and the other is "true."
            break;
    
        case 2:
            // Do something when both a and b are "true."
            break;
    }
    

    【讨论】:

      【解决方案4】:

      以下适用于我的情况。

      if (!(a^b)) {
        // do something when both true or both false
      } else {
        // do something when a and b are mismatch
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2014-06-24
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 2021-10-28
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多