这直接受到这个问题的启发。
有很多参考/声明说,当位运算符应用于布尔值时,不会短路。因此,例如
然而,JLS只是说:
15.22.2布尔逻辑运算符&、^和|
当&、^或|运算符的两个操作数都是布尔类型或Boolean类型时,位运算符表达式的类型为布尔类型。在所有情况下,必要时操作数会进行拆箱转换(§5.1.8)。
对于&,如果两个操作数的值都为true,则结果值为true;否则,结果为false。
对于^,如果操作数的值不同,则结果值为true;否则,结果为false。
对于|,如果两个操作数的值都为false,则结果值为false;否则,结果为true。
这如何保证两个操作数实际上都被评估了?除了
例如,
请注意:我不是在问它是否以这种方式实现(不执行短路)-它肯定是。
我在询问:
使用短路运算符实现,是否会违反语言标准?
有很多参考/声明说,当位运算符应用于布尔值时,不会短路。因此,例如
boolean a = f() & g()
,其中f()
和g()
都返回布尔值,两者始终都将被评估。然而,JLS只是说:
15.22.2布尔逻辑运算符&、^和|
当&、^或|运算符的两个操作数都是布尔类型或Boolean类型时,位运算符表达式的类型为布尔类型。在所有情况下,必要时操作数会进行拆箱转换(§5.1.8)。
对于&,如果两个操作数的值都为true,则结果值为true;否则,结果为false。
对于^,如果操作数的值不同,则结果值为true;否则,结果为false。
对于|,如果两个操作数的值都为false,则结果值为false;否则,结果为true。
这如何保证两个操作数实际上都被评估了?除了
xor
,如果其中一个参数违反条件(可能是第二个/右侧先被评估),仍然可以中断并返回结果。例如,
a&b
只需要评估b
为false即可将表达式评估为false。请注意:我不是在问它是否以这种方式实现(不执行短路)-它肯定是。
我在询问:
使用短路运算符实现,是否会违反语言标准?