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

时间:2015-12-28 12:02:56

标签: java assignment-operator operator-precedence boolean-expression

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

$("[href='../../_usercontrols/News/#tab-en']")

运行上面的代码时,我得到以下输出:

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)和而不是比较运算符(=

2 个答案:

答案 0 :(得分:4)

正如您所见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

答案 1 :(得分:3)

不同之处在于,在第二种情况下,您直接指定(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