This is what I want: !A || (A && B && C)
Is this equivalent to the original? !A || A && B && C
why or why not?
views:
137answers:
6&&
have precedence than ||
. the two expressions are the same. because A && B && C
will be evaluated first
Here's your operator Precedence guid in Java.
Yes, they are the same. So is the simplified !A || B && C
.
The &&
operator has higher precedence than the ||
operator, so the parentheses around the &&
operation are unnecessary.
To be sure and to be better readable I would suggest to put parantheses around the operations to make the precedence clear.
EDIT: This is not only my opinion. It is a recomondation according to MISRA-c (Rule 34) See electronicDesing at the bottom.
And since the precendence of && is over || they are the same.
Yes it would.
Have a look at the Java operator precedence.
As you'll notice, logical AND has higher precedence than logical OR which means that &&
"binds tighter than" ||
. Furthermore unary !
also has higher precedence than ||
so it will only affect the initial A
.
Yes the 2 expressions are equal. The reason that you don't need parenthesis in this specific expressions is that the && operator has priority over the || operator.
Edit: Here's a nice unit test that checks the equality for all possible values:
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);
}
}
}
}
}
The test passes, so the 2 expressions are indeed equal.
Operator precedence of a bitwise and (&&) is higher than the bitwise or (||). See http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
This means both logical expressions are equal as the A && B && C part of the second logical epxression is evaluated first then it is combined with the !A as you can see in the following table where F1 is your first expression and F2 your second
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
Following is also the java code to test this
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");
}
}