这是一段Java代码:
static boolean a; // gets false
static boolean b;
static boolean c;
public void printA(){
boolean bool = (a = true) || (b = true) && (c = true);
System.out.print(a + ", " + b + ", " + c);
}
它不编译,问题是什么?错误:此行上有多个标记; 'bool'变量行上的语法错误。
我希望它能打印true, false, true
。
虽然根据我的教程书,它会打印true, false, false
。
我知道它会执行短路,但在&&amp ;;双方都需要进行评估。那不是作业,我正在学习Java。 干杯
答案 0 :(得分:6)
(a = true) || (b = true) && (c = true);
相当于: -
(a = true) || ((b = true) && (c = true));
由于(a = true)
被评估为true
,因此不评估第二个表达式,因为你在那里使用短路运算符(||)。
因此最后两项任务不会发生。 b
和c
的值仍为false
。
注意: - 如果先前的评估可以获得某个结果,则短路操作员 - &&
和||
不会进一步评估。
所以: -
a && b
将无法评估 b 。
a || b
将无法评估 b 。
答案 1 :(得分:3)
我没有编译错误 - 这很好用:
public class Test {
static boolean a;
static boolean b;
static boolean c;
public static void main(String[] args) {
boolean bool = (a = true) || (b = true) && (c = true);
System.out.print(a + ", " + b + ", " + c);
}
}
打印出来
true, false, false
这是因为评估了||
的LHS,将a
设置为true并评估为true
。由于||
是短路的,因此不会评估||
((b = true) && (c = true)
)的RHS。
注意表达式
(a = true) || (b = true) && (c = true);
相当于:
(a = true) || ((b = true) && (c = true))
不的
((a = true) || (b = true)) && (c = true)
如果是后者,你会得到true, false, true
。
这是因为&&
具有更高的优先级(“比”更紧密“)||
。有关运算符优先级的完整列表,请参阅Java tutorial。
答案 2 :(得分:2)
static boolean a;
static boolean b;
static boolean c;
因为你没有用你的布尔值初始化,所以java会分配默认值“false”;
问题在于:
(a = true) || (b = true) && (c = true);
因为第一次评估返回true(a = true) - >如果第二部分没有“执行”,则为真。
使用运算符|| (true || //do not matter)
=真。是一种优化形式,不需要计算后半部分,第一部分已被评估为真。
答案 3 :(得分:1)
如果可能......
看起来有些人并没有得到问题所在。
x =(a = true)|| (b =真)&& (C == TRUE);
从&&优先级高于||,似乎(b = true)&& (c == true)应首先进行评估,从而将b和c设置为true。如果&&具有更高的优先级,为什么是||的操作数之一首先评估?
Rohit Jain到目前为止已经解释得最好。我可能补充的是,运算符的优先级并没有规定操作数的计算顺序 - 只是作为其他运算符的操作数必须完成的操作,如果不是短路运算符不必要的话。优先级决定了表达式的树(具有讽刺意味的是,先验较高的运算符在树中较低),但是无论运算符优先级如何,树都将按深度优先和从左到右进行求值。
||
/ \
= &&
/ \ / \
a t = =
/ \ / \
b t c t
首先,将a = true与执行赋值的“副作用”一起计算为值true。自||短路,另一边甚至没有看过。
如果你真的想要&& (及其操作数)首先要评估,你必须重写表达式:
x =(b = true)&& (c = true)|| (A = TRUE);
当然,然后将b和c设置为true,并且因为||而保持为false短路。
我认为我没有解释任何新内容,只是以较小的步骤解释相同的信息。