Java 布尔|= 运算符
最近我看到一个代码使用这个:
boolean val = something();
val |= somethingElse();
有趣的部分是|=(类似二进制)的运算符,该运算符由布尔基元类型制成。
令我惊讶的是,布尔值存在|=,就好像它是整数类型一样,并在Java规范中搜索了这个运算符,但找不到任何运算符。
我很好奇,如果左值已经为真,则评估右操作数。
有人可以给我指出这个Java规范吗?
最近我看到一个代码使用这个:
boolean val = something();
val |= somethingElse();
有趣的部分是|=(类似二进制)的运算符,该运算符由布尔基元类型制成。
令我惊讶的是,布尔值存在|=,就好像它是整数类型一样,并在Java规范中搜索了这个运算符,但找不到任何运算符。
我很好奇,如果左值已经为真,则评估右操作数。
有人可以给我指出这个Java规范吗?
来自 JLS:
该形式的复合赋值表达式等价于 ,其中 是 的类型,只计算一次。
E1 op= E2
E1 = (T) ((E1) op (E2))
T
E1
E1
当 、 或 运算符的两个操作数都为 类型或 时,按位运算符表达式的类型为 。在所有情况下,操作数都会根据需要进行拆箱转换 (§5.1.8)。
&
^
|
boolean
Boolean
boolean
对于 ,如果两个操作数值都为假,则结果值为假;否则,结果为真。
|
这意味着
val |= somethingElse();
严格等价于
val = val | somethingElse();
(假设返回或 )。somethingElse()
boolean
Boolean
我很好奇,如果左值已经为真,则评估右操作数。
是的,它将被评估,因为不会短路:|
Java 编程语言保证运算符的每个操作数(条件运算符 、 和 除外)在执行操作本身的任何部分之前都显示为完全计算完毕。
&&
||
? :
因此,计算的结果与 on 或 操作数相同。它的不同之处仅在于右侧操作数表达式是有条件计算的,而不是总是计算的。
||
|
boolean
Boolean