Java 布尔表达式上的编译错误
这是一段Java代码:Java 布尔表达式上的编译错误,java,compilation,boolean,Java,Compilation,Boolean,这是一段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); } 它
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”变量行出现语法错误。
我希望它打印出真的,假的,真的。
虽然根据我的指导书,它打印的是真、假、假
我知道它会短路,但在&&的情况下,需要对两侧进行评估。那不是家庭作业,我在学Java。
干杯
由于没有使用布尔值进行初始化,java将分配默认值false
问题在于:
(a = true) || (b = true) && (c = true);
由于第一次求值返回true a=true->true,因此第二部分不执行
使用运算符| | true |//donot matter=true。是一种优化形式,无需计算后半部分,因为前半部分已被评估为真
(a = true) || (b = true) && (c = true);
相当于:-
(a = true) || ((b = true) && (c = true));
由于a=true的计算结果为true,因此不计算第二个表达式,因为您在那里使用的是短路运算符| |
因此,最后两个任务不会发生。b和c的值仍然为假
注:-短路运算符-&&和| |,如果可以通过先前的评估获得特定结果,则不进行进一步评估
因此:-
如果a为false,a&&b将不计算b
如果a为真,a | | b将不会计算b
对我来说没有编译错误-这很好:
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。由于| |短路,不计算| |的RHS,即b=true&&c=true
请注意,表达式
(a = true) || (b = true) && (c = true);
相当于:
(a = true) || ((b = true) && (c = true))
不是
如果是后者,你会得到真的,假的,真的
这是因为&&具有比| |更高的优先级。有关运算符优先级的完整列表,请参见。如果可以的话
||
/ \
= &&
/ \ / \
a t = =
/ \ / \
b t c t
看起来有些人不太明白问题是什么
x=a=true | | b=true&&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,而a仍然为false,因为| |短路
我认为我没有解释任何新的内容,只是用更小的步骤解释了相同的信息。每当你声称存在编译错误时,你应该给出一个完整的示例来演示它并显示编译错误。
||
/ \
= &&
/ \ / \
a t = =
/ \ / \
b t c t