wmz*_*wmz 6 java short-circuiting jls
这直接受到这个问题的启发.
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路.换句话说boolean a = f() & g(),where f()和g()both都返回boolean,两者都将被评估.
但是,JLS只说:
15.22.2布尔逻辑运算符&,^和|
当两个操作数都是&,^或|时 operator的类型为boolean或Boolean,则按位运算符表达式的类型为boolean.在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节).对于&,如果两个操作数值都为真,则结果值为true; 否则,结果是错误的.
对于^,如果操作数值不同,则结果值为true; 否则,结果是错误的.
对于|,如果两个操作数值都为false,则结果值为false; 否则,结果是真的.
这如何保证两个操作数都被实际评估?除此之外xor,如果其中一个参数(可能是第二个/右边首先被评估)违反条件,您仍然可以中断并返回结果.
例如.a & b只需要评估b为false就可以将表达式计算为false.
请注意:我不是问它是否以这种方式实现(不会短路) - 当然是.
我在问:
短路实施会违反语言标准吗?
Java编程语言还保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外.
因此,如果您有运算符&,则需要在计算最终结果之前评估两个操作数.
另外,在那之前的部分明确地要求首先评估任何二元运算符的左操作数.