7

这是直接受到这个问题的启发。
有许多引用/声明,当应用于布尔值时,按位运算符不会短路。所以换句话说boolean a = f() & g(), wheref()bothg()返回布尔值,总是会被评估。 但是,JLS只说:

15.22.2 布尔逻辑运算符 &、^ 和 |
当 &、^ 或 | 的两个操作数 运算符的类型为 boolean 或 Boolean,则按位运算符表达式的类型为 boolean。在所有情况下,操作数都会根据需要进行拆箱转换(第 5.1.8 节)。

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

对于 ^,如果操作数的值不同,则结果值为真;否则,结果为假。

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

这如何保证两个操作数都被实际评估?除了,如果其中一个参数(可能是第二个/正确的第一个被评估的)违反条件xor,您仍然可以中断并返回结果。 例如。只需要评估为假即可将表达式评估为假。 请注意:我不是在问它是否以这种方式实现(不会短路)-当然是这样。
a & bb

我在问:

用短路实现它会违反语言标准吗?

4

2 回答 2

5

请参阅JLS 15.7.2 在操作前评估操作数

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

因此,如果您有 operator &,则需要在计算最终结果之前评估两个操作数。

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

于 2012-02-13T19:44:43.360 回答
1

JLS 明确指出,快捷方式是针对条件或和条件与执行的。它根据位或/与运算符解释了条件或/和的行为。因此,强调快捷方式是按位运算符的行为变化。

所以,我想说使用快捷方式会违反标准。这肯定会违背开发者的期望。

15.24 条件或运算符||

&& 运算符类似于 &(第 15.22.2 节),但仅当其左侧操作数的值为真时才计算其右侧操作数。

于 2012-02-13T19:37:53.323 回答