这就是我想要!A || (A && B && C)
的:这和原来的一样吗?!A || A && B && C
为什么或者为什么不?
6 回答
是的,它们是一样的。简化版也是如此!A || B && C
。
运算符的&&
优先级高于||
运算符,因此运算周围的括号&&
是不必要的。
是的。
看看Java 运算符优先级。
您会注意到,逻辑 AND 的优先级高于逻辑 OR,这意味着&&
"binds stricter than" ||
。此外,一元!
也具有更高的优先级,||
因此它只会影响初始的A
。
是的,这两个表达式是相等的。在此特定表达式中不需要括号的原因是 && 运算符优先于 || 操作员。
编辑:这是一个很好的单元测试,它检查所有可能值的相等性:
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 个表达式确实相等。
按位和 (&&) 的运算符优先级高于按位或 (||)。请参阅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");
}
}
&&
优先于||
。这两种表达方式是一样的。因为A && B && C
将首先评估
为了确保并更好地阅读,我建议在操作周围加上括号以明确优先级。
编辑:这不仅是我的意见。这是根据 MISRA-c(规则 34)的建议,请参阅底部的电子设计。
并且由于 && 的优先级已经结束 || 他们是一样的。