and mit Vorsicht genießen

vop

Erfahrenes Mitglied
Hi allerseits.

Dass and etwas anderes liefert als && habe ich wohl mitbekommen.
Dass Klammern die Rangfolge von Operatoren verändern ist auch klar.
Aber das was ich hier erlebt habe hat mich doch überrascht:

<?php
$result = (true) and (false) ;
if ($result)
{
print "Bedingung liefert true";
}
else
{
print "Bedingung liefert false";
};
?>

Bei mit liefert diese Ausgabe tatsächlich true!

Mein Erklärungsversuch:
( false )
wird als Ausdruck ausgewertet, weil er in Klammern steht und da false ein gültiger Ausdruck ist liefert ( false ) true, oder?

Btw. (true) && (false) liefert korrekterweise false.

Da läuft mir aber ein kalter Schauer den Rücken herunter, wenn ich an die vielen etwas größeren Programme denke......

vop
 
Hi

bin selbst auf die Lösung gekommen! Vorsicht ist aber allemal angesagt.
$result = (true) and (false) ;
Das obige Konstrukt wird gemäß Operatorrangfolge folgendermaßen ausgewertet:

1. $result = (true) Hier findet dann auch die Zuweisung statt
2. $result and false ist zwar false, wird aber nicht mehr zugewiesen (denn die Zuweisung fand ja bereits in 1. statt)

Damit liefert das Konstrukt zwar korrekterweise false, dieser Wert wird aber nicht an $result zugewiesen!

Also besser schreiben:
$result = ( (true) and (false) );

vop
 
Zurück