1

这就是我想要!A || (A && B && C) 的:这和原来的一样吗?!A || A && B && C为什么或者为什么不?

4

6 回答 6

8

是的,它们是一样的。简化版也是如此!A || B && C

运算符的&&优先级高于||运算符,因此运算周围的括号&&是不必要的。

于 2010-08-31T20:07:39.493 回答
2

是的。

看看Java 运算符优先级

您会注意到,逻辑 AND 的优先级高于逻辑 OR,这意味着&& "binds stricter than" ||。此外,一元!也具有更高的优先级,||因此它只会影响初始的A

于 2010-08-31T20:07:59.487 回答
2

是的,这两个表达式是相等的。在此特定表达式中不需要括号的原因是 && 运算符优先于 || 操作员。

编辑:这是一个很好的单元测试,它检查所有可能值的相等性:

package main;

import junit.framework.Assert;

public class Test
{
    enum BOOL
    {
        TRUE(true), FALSE(false);

        private boolean m_val;

        BOOL(boolean val)
        {
            m_val = val;
        }

        public boolean getValue()
        {
            return m_val;
        }
    }

    @org.junit.Test
    public void test1()
    {
        boolean a,b,c;
        for (BOOL boola : BOOL.values())
        {
            for (BOOL boolb : BOOL.values())
            {
                for (BOOL boolc : BOOL.values())
                {
                    a = boola.getValue();
                    b = boolb.getValue();
                    c = boolc.getValue();
                    boolean exp1 = !a || (a && b && c);
                    boolean exp2 = !a || a && b && c;
                    Assert.assertEquals(exp1, exp2);
                }
            }
        }
    }
}

测试通过,所以 2 个表达式确实相等。

于 2010-08-31T20:11:36.830 回答
0

按位和 (&&) 的运算符优先级高于按位或 (||)。请参阅http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

这意味着两个逻辑表达式都相等,因为首先评估第二个逻辑表达式的 A && B && C 部分,然后将其与 !A 组合,如下表所示,其中 F1 是您的第一个表达式, F2 是您的第二个表达式

A   B   C   F1  F2 
0   0   0   1   1
0   0   1   1   1
0   1   0   1   1
0   1   1   1   1
1   0   0   0   0
1   0   1   0   0
1   1   0   0   0
1   1   1   1   1

以下也是测试这个的java代码

public class TestLogic {
    public static void main(String[] args) {
        for (int i=0;i<8;i++) {
            boolean a=bit(i,3);
            boolean b=bit(i,2);
            boolean c=bit(i,1);
            System.out.println(asZeroOne(a)+asZeroOne(b)+asZeroOne(c)+"\t"+asZeroOne(f1(a,b,c))+"\t"+asZeroOne(f2(a,b,c)));
        }
    }

    static boolean f1(boolean a, boolean b, boolean c) {
        return !a || (a && b && c); 
    }

    static  boolean f2(boolean a, boolean b, boolean c) {
        return !a || a && b && c;
    }

    static  boolean bit(int value, int bitnumber) {
        int bitmask =  (int) Math.pow(2, bitnumber-1);
        return (value & bitmask)>0;
    }
    static String asZeroOne(boolean b) {
        return (b?"1":"0");
    }

}
于 2010-08-31T20:37:56.977 回答
0

&&优先于||。这两种表达方式是一样的。因为A && B && C将首先评估

这是Java 中的运算符优先级指南。

于 2010-08-31T20:07:12.533 回答
0

为了确保并更好地阅读,我建议在操作周围加上括号以明确优先级。

编辑:这不仅是我的意见。这是根据 MISRA-c(规则 34)的建议,请参阅底部的电子设计。

并且由于 && 的优先级已经结束 || 他们是一样的。

于 2010-08-31T20:07:40.757 回答