为什么这个布尔变量赋值为真?

Why is this boolean variable assigned true?

我有以下两个产生不同输出的代码片段:

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 将为假。

在第一种情况下,您实际分配给 a 的值不是 false,而是

false | (b = false) || (c = true) | (d = true)

相当于

false | false || true | true

true.

看看 operator precedence 看看这里到底发生了什么:

  • 首先处理|
  • 然后||
  • 然后 =

因此语句计算如下:

a = false | (b = false) || (c = true) | (d = true)
a = false | false || true | true
a = true || false
a = true

如您所见here| 运算符的优先级高于赋值运算符=。因此,当您不将 (a = false) 括在括号中时:

if (a = false | (b = false) || (c = true) | (d = true))

等同于

if (a = (false | (b = false) || (c = true) | (d = true)))

因此您将 true 分配给 a

另一方面,在

if ((a = false) | (b = false) || (c = true) | (d = true))

您正在将 false 分配给 a