Будет ли Java интерпретировать это логическое выражение так, как я хотел? - PullRequest
1 голос
/ 01 сентября 2010

Это то, что я хочу: !A || (A && B && C) Это эквивалентно оригиналу?!A || A && B && C почему или почему нет?

Ответы [ 6 ]

8 голосов
/ 01 сентября 2010

Да, они одинаковы. Так же и упрощенный !A || B && C.

Оператор && имеет более высокий приоритет, чем оператор ||, поэтому скобки вокруг операции && не нужны.

2 голосов
/ 01 сентября 2010

Да, 2 выражения равны. Причина, по которой вам не нужны скобки в этих конкретных выражениях, заключается в том, что оператор && имеет приоритет над || оператор.

Edit: Вот хороший модульный тест, который проверяет равенство для всех возможных значений:

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 выражения действительно равны.

2 голосов
/ 01 сентября 2010

Да, будет.

Посмотрите на приоритет оператора Java .

Как вы заметите, логическое И имеет более высокий приоритет, чем логическое ИЛИ , что означает, что && "связывает сильнее, чем" ||. Более того, унарный ! также имеет более высокий приоритет, чем ||, поэтому он влияет только на начальный A.

0 голосов
/ 01 сентября 2010

Оператор имеет приоритет побитового и (&&) выше, чем побитовый или (||).См. 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");
    }

}
0 голосов
/ 01 сентября 2010

Чтобы быть уверенным и лучше читаемым, я бы посоветовал поставить над операциями парантезы, чтобы прояснить приоритет.

РЕДАКТИРОВАТЬ: Это не только мое мнение.Это повторная рекомендация в соответствии с MISRA-c (Правило 34). См. electronicDesing внизу.

И так как приоритет && закончился ||они одинаковы.

0 голосов
/ 01 сентября 2010

&& имеет приоритет перед ||. два выражения одинаковы. потому что A && B && C будет оцениваться первым

Вот ваш указатель приоритета оператора в Java.

...