2017-10-21 6 views
2

In PHP, warum false and (true && print('hi')) wertet false aus und druckt 'hi' nicht? Ich weiß, logische Operatoren wertet in Kurzschluss (sie sind faul), aber && und Klammer hat upper precedence als and, so (true && print('hi')) sollte zuerst ausgewertet werden.false und (true && print ('hi'))

Irgendwelche Hinweise? Vielen Dank!

+0

@CBroe es nicht das selbe.he fragt, dass es nicht mit "wahr" arbeitet, wenn Betreiber Priorität berücksichtigt. – tan

+2

@tan ja ist es. Die Frage _ "wird die Bedingung nach && (oder' und ', wie hier) immer ausgewertet" _ wird mit Nein für 'falsch und etwas 'beantwortet - das' Etwas' wird nicht einmal weiter als nötig gesucht. Operatorpräzedenz bedeutet, welchen Einfluss der Operator auf das _result_ des Ausdrucks hat, nicht notwendigerweise die Bewertungsreihenfolge der einzelnen Unterausdrücke. – CBroe

+2

Nicht sicher, warum diese hypothetischen Fragen auftauchen, wenn ich diesen Code schrieb, während ich für eine Firma arbeitete, würde ich erwarten, herausgeschmissen zu werden, nicht gewählt auf SO. –

Antwort

0

Es ist eigentlich ein gutes Testbeispiel, um mit der Reihenfolge der Auswertung zu spielen.

Die Auswertung erfolgt von links nach rechts.

So etwas zu Ihrem Beispiel hinzuzufügen ...

<?php 

// Evaluates Left to right 
// Prints HI as (true && print('Hi') evaluates as TRUE 
// Then the && FALSE is tested and it fails 
if((true && print('Hi')) && FALSE){ 
    echo 'Success'; 
} else { 
    echo 'Failed'; 
} 

// Evaluates Left to right 
// FALSE is evaluated and Fails 
// No further checking is performed 
if(FALSE && (true && print('Hi'))){ 
    echo 'Success'; 
} else { 
    echo 'Failed'; 
} 

Anmerkung: Ich habe nicht in der Put- und vs & & aber die gleichen Ergebnisse erhalten.

0

ich in http://php.net/manual/en/language.operators.precedence.php sehen kann Folgendes:

Operator Vorrang und Assoziativität nur bestimmen, wie Ausdrücke gruppiert sind, sie nicht über eine Reihenfolge der Auswertung angeben. PHP legt (im allgemeinen Fall) nicht fest, in welcher Reihenfolge ein Ausdruck ausgewertet wird und Code, der eine bestimmte Reihenfolge der Auswertung annimmt, sollte vermieden werden, da sich das Verhalten zwischen PHP-Versionen oder abhängig vom umgebenden Code ändern kann.

So testete ich folgendes:

print('one') and (1 + print('two')) 

und er druckt:

onetwo 

so PHP wertet zunächst die and ‚s linken Operanden selbst + hat höhere Priorität und sogar Klammer mit . Interessant!

Danke an alle.

Verwandte Themen