‘UND’ vs ‘&&’ als Operator

Ich habe eine Codebasis, in der Entwickler beschlossen haben, AND und OR anstelle von && und || .

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

Welche Version verwendest du? Ist and lesbarer als && ? Oder gibt es keinen Unterschied?

Wenn Sie AND und OR , werden Sie schließlich von etwas wie diesem stolpern:

 $this_one = true; $that = false; $truthiness = $this_one and $that; 

Willst du raten, was $truthiness ist?

Wenn Sie false sagten … bzzzt, tut mir leid, falsch!

$truthiness oben hat den Wert true . Warum? = hat eine höhere Priorität als and . Das Hinzufügen von Klammern, um die implizite Reihenfolge zu zeigen, verdeutlicht dies:

 ($truthiness = $this_one) and $that 

Wenn Sie && anstelle von and im ersten Codebeispiel verwenden, würde es wie erwartet funktionieren und false .

Wie in den folgenden Kommentaren erläutert, funktioniert dies auch, um den korrekten Wert zu erhalten, da Klammern Vorrang vor = :

 $truthiness = ($this_one and $that) 

Abhängig davon, wie es verwendet wird, könnte es 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 mehr Entwicklergeschmack zu haben, wie jedes Vorkommen, das ich im CodeIgniter-Framework gesehen habe, wie @Sarfraz erwähnt hat.

Seit and hat niedrigere Priorität als = Sie können es in der Konditionszuweisung 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 

Aus Sicherheitsgründen klammere ich meine Vergleiche immer ein und spalte sie aus. Auf diese Weise muss ich mich nicht auf die Priorität des Operators verlassen:

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

Der Vorrang unterscheidet sich zwischen && und and (&& hat eine höhere Priorität als und), was bei Kombination mit einem ternären Operator zu Verwirrung führt. Zum Beispiel,

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

wird eine Zeichenkette zurückgeben, während

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

gibt einen booleschen Wert zurück .

Welche Version verwendest du?

Wenn die Codierungsstandards für die bestimmte Codebasis, für die ich Code schreibe, angibt, welcher Operator verwendet werden soll, werde ich das definitiv verwenden. Wenn nicht, und der Code diktiert, welche verwendet werden sollte (nicht oft, kann leicht umgangen werden), dann werde ich das verwenden. Ansonsten wahrscheinlich && .

Ist ‘und’ lesbarer als ‘&&’?

Ist es für dich besser lesbar ? Die Antwort ist Ja und Nein, abhängig von vielen Faktoren, einschließlich des Codes um den Bediener und tatsächlich der Person, die es liest!

|| da ist ~ Unterschied?

Ja. Siehe logische Operatoren für || und bitweise Operatoren für ~ .

Lassen Sie mich den Unterschied zwischen “und” – “&&” – “&” erklären.

“&&” und “und” sind beide logische UND-Operationen, und sie machen das gleiche, aber die Rangfolge der Operatoren ist anders.

Die Priorität (priority) eines Operators gibt an, wie “eng” er zwei Ausdrücke miteinander verbindet. Zum Beispiel ist in dem Ausdruck 1 + 5 * 3 die Antwort 16 und nicht 18, weil der Multiplikationsoperator (“*”) einen höheren Vorrang hat als der Additionsoperator (“+”).

Wenn Sie sie in einem Arbeitsgang vermischen, könnte das zu unerwarteten Ergebnissen führen. In einigen Fällen empfehle ich immer, && zu verwenden, aber das ist Ihre Entscheidung.


Auf der anderen Seite ist “&” eine bitweise UND-Verknüpfung . Es wird für die Auswertung und Manipulation bestimmter Bits innerhalb des Integer-Wertes verwendet.

Beispiel, wenn Sie (14 & 7) das Ergebnis wäre 6.

 7 = 0111 14 = 1110 ------------ = 0110 == 6 

Ich denke, es ist Geschmackssache, obwohl (fälschlicherweise) das Vermischen zu unerwünschten Verhaltensweisen führen könnte:

 true && false || false; // returns false true and false || false; // returns true 

Mit && und || ist sicherer, da sie die höchste Priorität haben. In Bezug auf die Lesbarkeit würde ich sagen, dass diese Operatoren universell genug sind.

UPDATE : Über die Kommentare, die sagen, dass beide Operationen falsch zurückgeben … nun, der obige Code gibt tatsächlich nichts zurück, es tut mir leid für die Mehrdeutigkeit. Zur Verdeutlichung: Das Verhalten im zweiten Fall hängt davon ab, wie das Ergebnis der Operation verwendet wird. Beobachten Sie, wie der Vorrang von Operatoren hier ins Spiel kommt:

 var_dump(true and false || false); // bool(false) $a = true and false || false; var_dump($a); // bool(true) 

Der Grund, warum $a === true ist, liegt darin, dass der Zuweisungsoperator Vorrang vor jedem logischen Operator hat, wie bereits in anderen Antworten sehr gut erklärt.

Hier ist ein kleines Gegenbeispiel:

 $a = true; $b = true; $c = $a & $b; var_dump(true === $c); 

Ausgabe:

 bool(false) 

Ich würde sagen, dass diese Art von Tipperrorsn viel eher heimtückische Probleme verursacht (ähnlich wie = vs == ) und viel weniger wahrgenommen wird als adn / ro Tipperrors, die als Syntaxerrors adn werden. Ich finde und / oder ist viel einfacher zu lesen. FWIW, die meisten PHP-Frameworks, die eine Präferenz (meist nicht) angeben und / oder. Ich bin auch nie auf einen echten, nicht erfundenen Fall gestoßen, in dem es darauf ankam.

Abhängig von der Sprache, die Sie verwenden, ist es in der Regel besser, && und || anstelle von and und or , außer in Sprachen wie Python, wo and und or stattdessen und && und || existiert nicht.

Ein weiteres schönes Beispiel, das if statementen ohne = Zuweisungsoperationen verwendet.

 if (true || true && false); // is the same as: if (true || (true && false)); // TRUE 

und

 if (true || true AND false); // is the same as: if ((true || true) && false); // FALSE 

weil AND eine niedrigere Priorität hat und somit || eine höhere Priorität.

Diese unterscheiden sich in den Fällen von true, false, false und true, true, false . Siehe https://ideone.com/lsqovs für ein ausführliches Beispiel.