これは私が欲しいものです:これは!A || (A && B && C)
オリジナルと同等ですか?!A || A && B && C
なぜまたはなぜそうではないのですか?
6 に答える
はい、同じです。簡略化されて!A || B && C
います。
演算子は&&
演算子よりも優先順位が高い||
ため、操作を囲む括弧&&
は不要です。
はい、そうです。
Java演算子の優先順位を見てください。
お気づきのように、論理積は論理積よりも優先されます。これは、 &&
「より緊密に結合する」 ||
ことを意味します。さらに、単項!
も優先順位が高い||
ため、最初のにのみ影響しA
ます。
はい、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つの式は実際に等しくなります。
&&
よりも優先され||
ます。2つの式は同じです。A && B && C
最初に評価されるため
これが、Javaの演算子PrecedenceGUIDです。
確実に読みやすくするために、優先順位を明確にするために、演算の周りに括弧を配置することをお勧めします。
編集:これは私の意見だけではありません。これは、MISRA-c(ルール34)に準拠したリコモンドです。下部のelectronicDesingを参照してください。
そして&&の優位性が終わったので|| それらは同じです。
ビット単位および(&&)の演算子の優先順位は、ビット単位または(||)よりも高くなります。http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.htmlを参照してください
これは、2番目の論理式のA && B && C部分が最初に評価され、次にF1が最初の式でF2が2番目の式である次の表に示すように、!Aと結合されるため、両方の論理式が等しいことを意味します。
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");
}
}