345 Stimmen

AND" vs. "&&" als Operator

Ich habe eine Codebasis, bei der die Entwickler beschlossen haben, die AND y OR 代わりに && y || .

Ich weiß, dass es einen Unterschied in der Rangfolge der Operatoren gibt ( && geht vor and ), sondern mit dem vorgegebenen Rahmen ( PrestaShop um genau zu sein) ist es eindeutig kein Grund.

Welche Version verwenden Sie? Ist and besser lesbar als && ? Oder gibt es keinen Unterschied?

729voto

Powerlord Punkte 84404

Wenn Sie AND y OR werden Sie irgendwann über so etwas stolpern:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

Wollen Sie raten, was $truthiness gleichgestellt?

Wenn Sie sagen false ... bzzzt, sorry, falsch!

$truthiness oben hat den Wert true . Warum? = hat eine höherer Vorrang als and . Die Hinzufügung von Klammern zur Darstellung der impliziten Reihenfolge macht dies deutlicher:

($truthiness = $this_one) and $that

Wenn Sie die && 代わりに and im ersten Codebeispiel, würde es wie erwartet funktionieren und false .

Wie in den Kommentaren unten erörtert, funktioniert dies auch, um den richtigen Wert zu erhalten, da Klammern einen höheren Vorrang haben als = :

$truthiness = ($this_one and $that)

48voto

adamJLev Punkte 13305

Je nach Verwendungszweck kann dies notwendig und sogar praktisch sein. http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

Aber in den meisten Fällen scheint es eher eine Sache des Geschmacks der Entwickler zu sein, wie bei jedem Vorkommen dieses Problems, das ich im CodeIgniter-Framework gesehen habe, wie @Sarfraz erwähnt hat.

16voto

Justinas Punkte 37558

Desde and hat einen niedrigeren Vorrang als = können Sie es in der Konditionszuordnung verwenden:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

13voto

Captain Kenpachi Punkte 6718

Zur Sicherheit setze ich meine Vergleiche immer in Klammern und schiebe sie in die Länge. Auf diese Weise muss ich mich nicht auf den Vorrang von Operatoren verlassen:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

12voto

arviman Punkte 4817

Der Vorrang unterscheidet sich zwischen && y et (&& hat einen höheren Vorrang als and), was in Kombination mit einem ternären Operator zu Verwirrung führt. Zum Beispiel,

$predA && $predB ? "foo" : "bar"

gibt eine String während

$predA and $predB ? "foo" : "bar"

gibt eine boolean .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X