为什么这个布尔变量赋值为真?
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
。
我有以下两个产生不同输出的代码片段:
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
。