Java 为什么这个布尔变量赋值为true?
我有以下两个产生不同输出的代码段:Java 为什么这个布尔变量赋值为true?,java,assignment-operator,operator-precedence,boolean-expression,Java,Assignment Operator,Operator Precedence,Boolean Expression,我有以下两个产生不同输出的代码段: boolean a = false, b = false, c = false, d = false; if (a = false | (b = false) || (c = true) | (d = true)){ } System.out.println("if (a = false | (b = false) || (c = true) | (d = true))"); System.out.printf("a=%b\nb=%b\nc=%b\nd=%b
boolean a = false, b = false, c = false, d = false;
if (a = false | (b = false) || (c = true) | (d = true)){
}
System.out.println("if (a = false | (b = false) || (c = true) | (d = true))");
System.out.printf("a=%b\nb=%b\nc=%b\nd=%b\n\n", a, b, c, d);
if ((a = false) | (b = false) || (c = true) | (d = true)){
}
System.out.println("if ((a = false) | (b = false) || (c = true) | (d = true))");
System.out.printf("a=%b\nb=%b\nc=%b\nd=%b\n", a, b, c, d);
运行上述代码时,我得到以下输出:
if (a = false | (b = false) || (c = true) | (d = true))
a=true
b=false
c=true
d=true
if ((a = false) | (b = false) || (c = true) | (d = true))
a=false
b=false
c=true
d=true
请注意,a
在第一个代码段中分配了true
,但在第二个代码段中没有分配
为什么将a
的赋值用括号括起来会产生如此大的差异
请注意,我故意使用赋值运算符(
=
)和而不是比较运算符(=
) 区别在于,在第二种情况下,您直接分配(a=false)
-因此a
将为false
在第一种情况下,实际分配给a的值不是false
,而是
false | (b = false) || (c = true) | (d = true)
这相当于
false | false || true | true
if (a = (false | (b = false) || (c = true) | (d = true)))
这是正确的
看一看,看看这里到底发生了什么:
- 首先处理
|
- 然后是
|
- 然后
=
a = false | (b = false) || (c = true) | (d = true)
a = false | false || true | true
a = true || false
a = true
如您所见,|
运算符的优先级高于赋值运算符=
。因此,当您不将(a=false)
括在括号中时:
if (a = false | (b = false) || (c = true) | (d = true))
相当于
false | false || true | true
if (a = (false | (b = false) || (c = true) | (d = true)))
因此,您将true
分配给a
另一方面,在
if ((a = false) | (b = false) || (c = true) | (d = true))
您正在将
false
分配给a
@Eran,我不想进行比较,而是将其设置为false。但是为什么它会变成真的?@JohnE:那你到底为什么要用if语句呢?@Stultuske在if语句中赋值没有什么错。@luk2302我不是在混淆它,我是在赋值。@JohnE:把你的内衣当帽子用没有错。你也这么做吗?如果没有条件,为什么要使用if语句?