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

Posted

技术标签:

【中文标题】什么(在规范中)保证“非短路逻辑运算符实际上不会短路?【英文标题】:What (in the specs) warrants that 'non short circuit logical operators will in fact not short circuit? 【发布时间】:2012-03-05 05:00:29 【问题描述】:

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

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

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

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

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

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

我在问:

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

【问题讨论】:

是的。标准文本说明了两个操作数的值,即两个表达式都需要计算。 【参考方案1】:

JLS 15.7.2 Evaluate Operands before Operation

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

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

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

【讨论】:

我对找到这个部分印象深刻。【参考方案2】:

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

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

15.24 条件或运算符 ||

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

【讨论】:

以上是关于什么(在规范中)保证“非短路逻辑运算符实际上不会短路?的主要内容,如果未能解决你的问题,请参考以下文章

问题整理(并发基础)

前端规范

流程保证质量(规范+测试+设计)

Django RESTframework(一):接口与规范

Android单元测试与模拟测试详解

什么是好的API与设计流程和设计原则