如何证明'&&'和'||'的优先顺序 通过java中的CODING?

pf_*_*les 8 java operator-precedence

我从某个地方知道逻辑和:'&&'的优先级高于逻辑或:'||' 在java.And编程时我很少犯错误.但到目前为止,我没有找到关于这种优先权如何真正起作用的任何线索?如果我不知道两者的优先级以及我会犯下什么错误会怎么样?我试着编写一些代码来证明'&&'和'||'的优先级 但失败了,例如:

boolExp1 || boolExp2 && boolExp3 || boolExp4
Run Code Online (Sandbox Code Playgroud)

无论"&&"和"||"的优先级如何,上面的代码都会产生相同的结果,即'false || false && true || 无论优先级是什么,false'结果都是假的.

所以,换句话说,我想要一个方法或函数,可以证明'&&'和'||'的优先级,它应该产生不同的结果取决于'&&'和'||'的优先级......这个功能可以制作吗?有可能吗?我想这可能是一个棘手的问题或一个非常简单的问题......可能不是一个java问题,而是一些数学......总而言之,有人帮忙吗?谢谢.

Jon*_*eet 19

我们来看看你的例子:

boolExp1 || boolExp2 && boolExp3 || boolExp4
Run Code Online (Sandbox Code Playgroud)

现在我们相信这些行为:

boolExp1 || (boolExp2 && boolExp3) || boolExp4
Run Code Online (Sandbox Code Playgroud)

对?

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

(boolExp1 || boolExp2) && (boolExp3 || boolExp4)
Run Code Online (Sandbox Code Playgroud)

什么样的价值boolExp1会给我们带来不同的结果?

好吧,我们来看看:

boolExp1 = true
boolExp2 = false
boolExp3 = false
boolExp4 = false
Run Code Online (Sandbox Code Playgroud)

在"&&具有更高优先级"规则下,结果将是真实的.在"||具有更高的优先级规则"下,结果将为false.然而,快速测试表明表达式的计算结果为true.

当然,这并不能证明&&的优先级高于|| - 只是那个|| 没有比&&更高的优先级.我们可以考虑它们是否具有相同的优先级 - 并以类似的方式测试其他表达式...找到一个样本表达式和值,这些表达式和值将在不同的优先级规则下给出不同的结果,并测试它们.

最终,我更喜欢:

  • 除非我有特别的疑虑,否则要相信规范
  • 使用括号使我的意图清楚

我不会首先使用第一个表达式"原样"...因为除非你真的知道优先规则(并且我怀疑许多Java开发人员没有 - 我不能发誓我已经得到了&&和||右)你在黑暗中.最好将其明确和清楚地表达在哪里有任何疑问.


Sto*_*ica 10

如果&&没有比优先级更高的优先级||,那么这个表达式:

a || b && c
Run Code Online (Sandbox Code Playgroud)

会像这样评估:

(a || b) && c
Run Code Online (Sandbox Code Playgroud)

为了验证是否是这种情况,您都可以产生的所有组合a,bc,结果比较这两个表情,看看他们总是相等与否,那就是:

  1. 对于所有组合a,bc
  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));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

true false false
   true || false  && false => true
  (true || false) && false => false
true true false
   true || true  && false => true
  (true || true) && false => false
Run Code Online (Sandbox Code Playgroud)

因此,&&优先级高于||.


小智 7

我也有同样的问题,但答案实际上已经给了我。这是我的例子:

true || true && false
Run Code Online (Sandbox Code Playgroud)

相当于

true || (true && false)
Run Code Online (Sandbox Code Playgroud)

因此,通过这个示例,很容易看出,在 Java 中,逻辑 && 的优先级高于 ||。