boolean a = false;
boolean b = false;
boolean c = false;
boolean bool = (a = true) || (b = true) && (c = true);
System.out.println("" + a + b + c);
prceding代码打印truefalsefalse
。但是,&&
运算符的优先级高于||
运算符,应首先进行求值,那么为什么不打印truetruetrue
?
答案 0 :(得分:8)
我相信你问题的关键在于这一部分:
但是,&&运算符的优先级高于||运营商,应首先评估
没有。优先顺序不会影响执行排序。这是有效的包围。所以你的表达式相当于:
boolean bool = (a = true) || ((b = true) && (c = true));
...首先仍然执行a = true
。此时,结果肯定是true
且||
正在短路,||
的右侧操作数未执行,因此b
和{{ 1}}是假的。
在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已完全评估。
优先顺序与此无关。
答案 1 :(得分:3)
||
是短路的,所以只有左边的false
才会评估它的右侧。
答案 2 :(得分:0)
因为它执行延迟评估。
由于(a = true)
返回true
,因此永远不会评估(b = true) && (c = true)
。因此你得到这样的输出。
答案 3 :(得分:0)
&&和||操作员是“短路的”:如果没有必要,他们不评估右侧。