说明书中哪些内容表明“非短路逻辑运算符实际上不会发生短路现象”?

7
这直接受到这个问题的启发。
有很多参考/声明说,当位运算符应用于布尔值时,不会短路。因此,例如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。

请注意:我不是在问它是否以这种方式实现(不执行短路)-它肯定是。
我在询问:
使用短路运算符实现,是否会违反语言标准?

是的。标准文本规定了两个操作数的值,即需要评估两个表达式。 - rsp
2个回答

5

请参见 JLS 15.7.2 在操作之前评估操作数

Java编程语言还保证,在执行任何操作的任何部分之前,运算符的每个操作数(条件运算符&&,||和?:除外)似乎都已完全求值。

因此,如果您使用运算符&,则需要评估两个操作数才能计算出最终结果。

此外,前面的部分明确要求首先评估任何二元运算符的左操作数。


让我对你找到这个部分印象深刻。 - Louis Wasserman

1

JLS明确规定了对条件或和条件与进行了快捷操作。它用按位或和按位与运算符解释了条件或/与的行为。因此,它强调快捷操作是与按位运算符不同的一种行为变化。

所以,我认为使用快捷操作会违反标准。这肯定会违背开发者的期望。

15.24 条件或运算符 ||

&& 运算符类似于 & (§15.22.2),但只有在其左操作数的值为true时才评估其右操作数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接