2016-12-19 28 views
4

我要检查两个表达式是否在Java等同与否。比方说,我有两个表达式:
EXP 1:如何检查两个表达式是否相等或没有在Java中

A && B && (C || D) 

EXP 2:

B && (C || D) && A 

我要检查这两个表达式是否相等或没有。

我的意思相当于是,如果说我们有两个表达式,然后这两个表达式必须具有相同的记号(A,B,C,d)以及它们之间的相同关系运算符。并且应该为所有输入返回相同的值。我不想考虑java如何执行这些事情的顺序。我需要的是一个库或一些Java代码片段。有关算法的信息也很好。

+2

关于尝试什么呢? –

+0

它们在逻辑上是相同的,但不是性能明智的。只要“A”,“B”或“C ||” D'评估为'false',那么检查其他人就没有意义了,VM不会这样做。虚拟机按顺序检查它们,所以这个命令在性能方面很重要。因此,如果例如'A'很可能是'真实',并且性能很重要,请检查*最后*,就像您在第二个示例中所做的一样。 – Gendarme

+0

一般来说,您必须检查所有可能的真值和假值,这会给出2^4个排列,即16个。但是在这种特殊情况下,它们看起来完全相同。 – abbath

回答

4

他们不因短期的评价。在Java中,当A评估为false时,A && B立即返回false。它有所不同,例如当涉及Exceptions或不是纯函数的布尔方法时。

你可以尝试以下实验:

public class Test { 

    public n = 0; 
    public boolean A() { 
     System.out.println("A"); 
     return false; 
    } 
    public boolean B() { 
     System.out.println("B"); 
     return true; 
    } 
    public boolean C() { 
     n++; 
     return true; 
    } 
    public boolean D() { 
     n = n*2; 
     return false; 
    } 
    public static void main(String[] args) { 
     Test test = new Test(); 
     if (test.A() && test.B()) { System.out.println("true"); } 
     if (test.B() && test.A()) { System.out.println("true"); } 
     if (test.C() && test.D()){} 
     else {System.out.println(t.n);} 
     t.n = 0; 
     if (test.D() && test.C()){} 
     else {System.out.println(t.n);} 
     t.n = 0; 
     boolean c = test.C(); 
     boolean d = test.D(); 
     if (d && c){} 
     else {System.out.println(t.n);} 
    } 
} 

它显示了副作用连接在简短的评估所造成的后果。

+0

嘿,我正在寻找一些算法或一些包在j AVA,以便我可以检查相同的表情 – Naruto

+1

@Naruto *,但它们不相同*。 –

+0

@AndyTurner:我同意你和xenteros;我认为OP是a)有点幼稚,并且b)想要对涉及&和|的逻辑布尔公式这样做而不是&&和|| –

相关问题