我有以下两个产生不同输出的代码片段:
$("[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
)和而不是比较运算符(=
)。
答案 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