这是直接受到这个问题的启发。
有许多引用/声明,当应用于布尔值时,按位运算符不会短路。所以换句话说boolean a = f() & g()
, wheref()
和bothg()
返回布尔值,总是会被评估。
但是,JLS只说:
15.22.2 布尔逻辑运算符 &、^ 和 |
当 &、^ 或 | 的两个操作数 运算符的类型为 boolean 或 Boolean,则按位运算符表达式的类型为 boolean。在所有情况下,操作数都会根据需要进行拆箱转换(第 5.1.8 节)。对于 &,如果两个操作数值都为真,则结果值为真;否则,结果为假。
对于 ^,如果操作数的值不同,则结果值为真;否则,结果为假。
对于 |,如果两个操作数的值都为假,则结果值为假;否则,结果为真。
这如何保证两个操作数都被实际评估?除了,如果其中一个参数(可能是第二个/正确的第一个被评估的)违反条件xor
,您仍然可以中断并返回结果。
例如。只需要评估为假即可将表达式评估为假。
请注意:我不是在问它是否以这种方式实现(不会短路)-当然是这样。a & b
b
我在问:
用短路实现它会违反语言标准吗?