Я написал код по ошибке сегодня и был удивлен, когда Eclipse не кричал на меня, на этот раз. Код имел двойное использование оператора структурного равенства (==
), аналогичного приведенному ниже с структурой if(a==b==c)
.
public class tripleEqual {
public static void main(String[] args) {
boolean[] a = { true, false };
boolean[] b = { true, false };
boolean[] c = { true, false };
for (int aDex = 0; aDex < 2; aDex++) {
for (int bDex = 0; bDex < 2; bDex++) {
for (int cDex = 0; cDex < 2; cDex++) {
if (a[aDex] == b[bDex] == c[cDex]) {
System.out.printf("Got a==b==c with %d %d %d\n", aDex, bDex, cDex);
}
}
}
}
}
}
Вывод
Got a==b==c with 0 0 0
Got a==b==c with 0 1 1
Got a==b==c with 1 0 1
Got a==b==c with 1 1 0
Играя, я замечаю, что я не могу сделать if(a==b==c)
с любым типом, но boolean
. Отсюда следует, что булево выражение
( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')
что упрощается до (A=B).'C + (A<>B).C
.
Таким образом, игнорирование побочного эффекта if(a==b==c)
равно if(a==b && !c) || (a!=b && c))
.
Может ли кто-нибудь объяснить, как синтаксис if(a==b==c)
предполагает, что?
Изменить 1:
Я нашел, где мое замешательство было после того, как многие люди объяснили левую ассоциативность. Обычно я пишу '1' для true и '0' для false, но моя свернутая таблица истинности/вывода в вышеприведенном тесте, у меня было "0" для true и "1" для false. Отрицание выражения ( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')
равно (A=B)=C
!