【发布时间】:2016-12-19 07:49:57
【问题描述】:
我想检查Java 中的两个表达式是否等价。假设我有两个表达式:
exp 1:
A && B && ( C || D)
exp 2:
B && ( C || D ) && A
我想检查这两个表达式是否等价。
我所说的等价的意思是,如果说我们有两个表达式,那么这两个表达式必须具有相同的标记(A、B、C、D)和它们之间的相同关系运算符。并且应该为所有输入返回相同的值。我不想考虑java如何执行这些事情的顺序。我需要的是一个库或一些 java 代码 sn-p 这样做。关于算法的信息也很好。
【问题讨论】:
-
试试看怎么样?
-
它们在逻辑上是相同的,但在性能方面并不相同。只要
A、B或C || D评估为false,那么检查其他的就没有意义了,VM 也不会这样做。虚拟机按顺序检查它们,因此顺序对性能很重要。因此,例如,如果A可能是true,并且对性能很重要,请像在第二个示例中那样检查它last。 -
一般来说,您必须检查所有可能的真假值,这会给您 2^4 个排列,即 16。但是在这种特殊情况下,它们看起来是相同的。
-
很简单:它们并不相同。如果 Java 没有副作用,它们将是相同的,但事实并非如此。短路不是唯一的原因 - 这个表达式是从左到右计算的,因此早期子表达式之一中的任何副作用都会影响整个评估,并且两个表达式中的顺序不同
-
您是否在问表达式是否等效,因为它们返回相同的结果,因为 A、B、C 和 D 都是布尔值?在这种情况下,您想从数学的角度评估给定的表达式等价性。这不一定符合语言规则(因为如前所述,Java 语言并不认为表达式是等价的)。最好的办法可能是找到一个做这种事情的图书馆。它可能涉及将表达式解析为字符串,并且问题超出了范围,因为它要求库执行此操作。
标签: java pattern-matching expression