Java 布尔|= 运算符

最近我看到一个代码使用这个:

boolean val = something();
val |= somethingElse();

有趣的部分是|=(类似二进制)的运算符,该运算符由布尔基元类型制成。

令我惊讶的是,布尔值存在|=,就好像它是整数类型一样,并在Java规范中搜索了这个运算符,但找不到任何运算符。

我很好奇,如果左值已经为真,则评估右操作数。

有人可以给我指出这个Java规范吗?


答案 1

来自 JLS:

15.26.2. 复合赋值运算符

该形式的复合赋值表达式等价于 ,其中 是 的类型,只计算一次。E1 op= E2E1 = (T) ((E1) op (E2))TE1E1

15.22.2. 布尔逻辑运算符 &^|

当 、 或 运算符的两个操作数都为 类型或 时,按位运算符表达式的类型为 。在所有情况下,操作数都会根据需要进行拆箱转换 (§5.1.8)。&^|booleanBooleanboolean

对于 ,如果两个操作数值都为假,则结果值为假;否则,结果为真。|

这意味着

val |= somethingElse();

严格等价于

val = val | somethingElse();

(假设返回或 )。somethingElse()booleanBoolean

我很好奇,如果左值已经为真,则评估右操作数。

是的,它将被评估,因为不会短路:|

15.7.2. 操作前评估操作数

Java 编程语言保证运算符的每个操作数(条件运算符 、 和 除外)在执行操作本身的任何部分之前都显示为完全计算完毕。&&||? :

15.24. 条件或运算符||

因此,计算的结果与 on 或 操作数相同。它的不同之处仅在于右侧操作数表达式是有条件计算的,而不是总是计算的。|||booleanBoolean


答案 2

有关 的定义,请参见 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2。有关 的定义,请参见 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2。这些定义正是您所想的。||=

令我惊讶的是缺少操作员。||=