什么(在规范中)保证'非短路逻辑运算符实际上不会短路?

时间:2012-02-13 19:17:18

标签: java short-circuiting jls

这直接受到this question的启发。
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路。换句话说,boolean a = f() & g(),其中f()g()都返回布尔值, 总是会被评估。
但是,JLS仅表示:

  

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

     

对于&amp ;,如果两个操作数值都为真,则结果值为true;   否则,结果是错误的。

     

对于^,如果操作数值不同,则结果值为true;   否则,结果是错误的。

     

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

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

我在问:

  

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

2 个答案:

答案 0 :(得分:5)

请参阅JLS 15.7.2 Evaluate Operands before Operation

  

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

因此,如果你有运算符&,那么两个操作数都需要在计算最终结果之前进行评估。

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

答案 1 :(得分:1)

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

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

15.24条件或算子||

&&运营商就像& (§15.22.2),但仅在其左侧操作数的值为真时才计算其右侧操作数。