【发布时间】:2019-08-03 16:57:45
【问题描述】:
所以无论我在哪里看,它都说首先评估 &&,然后 ||被评估为第二。所以要么我做错了什么,要么是错的。代码如下:
static boolean foo(boolean b, int id){ System.out.println(id); return b;}
static{ System.out.println(foo(true, 3) && foo(true, 1) || foo(false, 2)) }
//returns 3 1
static{ System.out.println(foo(true, 2) || foo(true, 3) && foo(true, 1)}
//returns 2
在第一个静态块中, && 先行,短路并忽略 ||但在第二个静态块中,这只是相反,||首先忽略 &&。这演示了从左到右,但根据 java 文档,&& 具有更高的优先级,这意味着 && 应该始终排在第一位。
一些关于优先级的文档(逻辑and高于or):
1.https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
2.https://chortle.ccsu.edu/Java5/Notes/chap40/ch40_16.html
3.http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html
...
【问题讨论】:
-
从左到右评估...不确定您在看哪里。
-
我认为发生的事情是逻辑被短路了。在评估
||时,一旦获得true,则不需要评估表达式的其余部分,因为它已经是true,这是正常的。如果您有不同的想法,请告诉我们。 -
不,我不认为这是正确的。即使 && 更高,只要 || 的左侧仍然是正确的为真,则整个表达式为真。在某些方面,我认为你有它倒退。因为 && 具有更高的优先级,这意味着 ||走在最后,然后控制最终结果。用真值表算出来,看看我是否正确。
-
P. S. 请记住,短路评估要求首先评估左侧,所以这就是 ||和 && 正在做。这就是为什么第一个输出有两个输出,第二个输出只有一个。
-
这里太混乱了。 1. 操作数从左到右计算。 2. 算子按优先级计算。 3.如果LHS为假,则不评估
&&的RHS。 4. 如果 LHS 为真,则不评估||的 RHS。