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语句?