这直接受到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
请注意:我不是问它是否以这种方式实现(不会短路) - 当然是。
我在问:
用短路违反语言来实现它 标准?
答案 0 :(得分:5)
请参阅JLS 15.7.2 Evaluate Operands before Operation
Java编程语言还保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外似乎都要完全评估。
因此,如果你有运算符&
,那么两个操作数都需要在计算最终结果之前进行评估。
此外,之前的部分明确要求首先评估任何二元运算符的左操作数。
答案 1 :(得分:1)
JLS明确指出对条件和/和条件和执行快捷方式。它解释了条件或/和按位或/和运算符的行为。因此,它强调快捷方式是来自按位运算符的行为变化。
所以,我会说使用快捷方式会违反标准。这肯定会违反开发者的期望。
15.24条件或算子||
&&运营商就像& (§15.22.2),但仅在其左侧操作数的值为真时才计算其右侧操作数。