Heute bin ich in unserem Quellcode auf folgendes Schuckstück gestoßen:
if( x1 >= x2 || ( !( x1 < x2 || y1 < y2 ) && z1 >= z2 ) )
{
// Do other very crazy stuff
}
Als ich dies gelesen habe, hat mich sofort ein komisches Gefühl beschlichen ohne sofort zu wissen warum (Intuition?). Dann habe ich den Ausdruck mal näher untersucht.
Zuerst habe ich mal !( x1 < x2 || y1 < y2 ) aufgelöst.
Nach den Gesetzen von De Morgan ist !( A || B ) = !A && !B. Das ergibt:
!(x1<x2) && !(y1<y2)
Wenn jetzt x1<x2 bzw. y1<y2 wahr ist, so ist x1>=x2 bzw. y1>=y2 falsch. Daraus folgt:
!( x1 < x2 || y1 < y2 ) == x1 >= x2 && y1 >= y2
Dies setzen wir wieder in die gesamte Logikgleichung ein:
x1 >= x2 || ( x1 >= x2 && y1 >= y2 && z1 >= z2)
Dies entspricht dem Boolschen Ausdruck A || ( A && B && C ). Wenn A also true ist, ist perse der ganze Ausdruck wegen der Veroderung mit A true. Ist A false, so kann der ganze Ausdruck nur noch true werden, wenn A && B && C true wird. Da A in diesem Fall aber false ist, ist A && B && C auch immer false. Somit entspricht dieser Ausdruck einfach A.
Dies bedeutet, die obige if Anweisung kann auf folgende reduziert werden:
if( x1 >= x2 ) {…}