如何通过用Java编码来证明“&&”和“||”的优先级?

2022-09-04 23:56:18

我从某个地方知道逻辑AND:在Java中比逻辑OR:具有更高的优先级,但直到现在我还没有找到任何关于这种优先级如何真正起作用的线索。如果我不知道两者的优先级会发生什么,我会犯什么错误?我试图编写一些代码来证明和的优先级,但失败了,例如:&&||&&||

boolExp1 || boolExp2 && boolExp3 || boolExp4

上面的代码无论 和 的优先级如何,都会产生相同的结果,即&&||

false || false && true || false

无论优先级如何,都会导致结果。false

我想要一个可以证明 和 的优先级的方法或函数。它应该产生不同的结果,具体取决于 和 的优先级。可能吗?&&||&&||


答案 1

让我们以您的示例表达式为例:

boolExp1 || boolExp2 && boolExp3 || boolExp4

现在我们认为它的作用是:

boolExp1 || (boolExp2 && boolExp3) || boolExp4

右?

因此,让我们假设相反的情况是正确的,它实际上是

(boolExp1 || boolExp2) && (boolExp3 || boolExp4)

etc的哪些值会给我们带来不同的结果?boolExp1

好吧,让我们来看看:

boolExp1 = true
boolExp2 = false
boolExp3 = false
boolExp4 = false

根据“&&具有更高的优先级”规则,结果将是正确的。在“||下具有更高的优先级规则“,结果将为假。但是,快速测试表明表达式的计算结果为 true。

当然,这实际上并不能证明 && 的优先级高于 ||- 只是那||没有比 &&更高的优先级。我们可以考虑它们是否具有相同的优先级 - 并以类似的方式用其他表达式对其进行测试......查找在不同优先级规则下将给出不同结果的示例表达式和值,并对其进行测试。

但最终,我更喜欢:

  • 信任规范,除非我有特定的疑问
  • 用括号来明确我的意图

我不会首先使用第一个表达式“按原样”...因为除非你真的知道优先规则(我怀疑许多Java开发人员不知道 - 我不能发誓我会得到&&和||对),否则你就在黑暗中。最好在有疑问的地方明确和清晰。


答案 2

如果优先级不高于 ,则此表达式:&&||

a || b && c

将像这样评估:

(a || b) && c

要验证是否属于这种情况,您可以生成 、 和 的所有组合,并比较这两个表达式的结果,以查看它们是否始终相等,即:abc

  1. 对于 、 和 的所有组合abc
  2. 验证:(a || b && c) == ((a || b) && c)

示例代码:

for (int i = 0; i < 8; ++i) {
    boolean a = ((i >> 2) & 1) == 1;
    boolean b = ((i >> 1) & 1) == 1;
    boolean c = (i & 1) == 1;
    boolean x1 = (a || b && c);
    boolean x2 = ((a || b) && c);

    if (x1 != x2) {
        System.out.println(String.format("%s %s %s", a, b, c));
        System.out.println(String.format("   %s || %s  && %s => %s", a, b, c, x1));
        System.out.println(String.format("  (%s || %s) && %s => %s", a, b, c, x2));
    }
}

输出:

true false false
   true || false  && false => true
  (true || false) && false => false
true true false
   true || true  && false => true
  (true || true) && false => false

因此,具有比 更高的优先级。&&||


推荐