Ich habe eine Codebasis, in der Entwickler entschieden haben, AND
und OR
anstelle von &&
und zu verwenden ||
.
Ich weiß, dass es einen Unterschied in der Priorität der Operatoren gibt ( &&
geht vorher and
), aber mit dem gegebenen Framework ( genauer gesagt PrestaShop ) ist dies eindeutig kein Grund.
Welche Version verwenden Sie? Ist and
besser lesbar als &&
? Oder gibt es keinen Unterschied?
~
der bitweise NICHT-Operator und nicht der logische ist. ;-)Antworten:
Wenn Sie
AND
und verwendenOR
, werden Sie irgendwann von so etwas gestolpert:Möchten Sie erraten, was
$truthiness
gleich ist?Wenn du gesagt hast
false
... bzzzt, sorry, falsch!$truthiness
oben hat den Werttrue
. Warum?=
hat eine höhere Priorität alsand
. Das Hinzufügen von Klammern zur Darstellung der impliziten Reihenfolge macht dies klarer:Wenn Sie
&&
anstelle desand
ersten Codebeispiels verwenden, würde es wie erwartet funktionieren und seinfalse
.Wie in den Kommentaren unten erläutert, funktioniert dies auch, um den richtigen Wert zu erhalten, da Klammern eine höhere Priorität haben als
=
:quelle
and
or
ein für allemal DEPRECATE . Ich habe zu viele Leute gesehen, die dachten, sie seien genau dasselbe, und die Antworten hier sind mehr Zeugnisse.$foo and bar()
, die nette Abkürzungen für if-Anweisungen sind. Wenn unerwartetes Verhalten (aufgrund schlechter Dokumentation oder Nichtlesen) ein Grund wäre, etwas nicht zu verwenden, würden wir überhaupt nicht über die Verwendung von PHP sprechen.Je nachdem, wie es verwendet wird, kann es notwendig und sogar praktisch sein. http://php.net/manual/en/language.operators.logical.php
Aber in den meisten Fällen scheint es eher ein Entwicklergeschmack zu sein, wie jedes Vorkommen, das ich im CodeIgniter-Framework gesehen habe, wie es @Sarfraz erwähnt hat.
quelle
if ($f = false or true) $f = true;
- das Ergebnis wäre, dass$f
es am Ende wahr wird, weil der Ausdruck insgesamt als wahr ausgewertet wird.$f
wird false zugewiesen - aber die Bedingung wird als true ausgewertet und dann$f
überschrieben. Wenn die Bedingung als falsch bewertet$f
würde , würde sie niemals so oder so überschrieben werden.and
hat&&
, wo erand
in nur einigen Situationen&&
wie erwartet funktioniert und in allen wie erwartet funktioniert Situationen.Aus Sicherheitsgründen setze ich meine Vergleiche immer in Klammern und platziere sie. Auf diese Weise muss ich mich nicht auf die Priorität des Operators verlassen:
quelle
Die Priorität unterscheidet sich zwischen && und und (&& hat eine höhere Priorität als und), was in Kombination mit einem ternären Operator Verwirrung stiftet. Zum Beispiel,
gibt eine Zeichenfolge zurück, während
gibt einen Booleschen Wert zurück .
quelle
Da
and
hat eine niedrigere Priorität, als=
Sie es in der Bedingungszuweisung verwenden können:quelle
"&&" und "und" sind beide logische UND-Operationen und machen dasselbe, aber die Operator-Priorität ist unterschiedlich.
Die Priorität (Priorität) eines Operators gibt an, wie "eng" zwei Ausdrücke miteinander verbunden werden. Beispielsweise lautet die Antwort im Ausdruck 1 + 5 * 3 16 und nicht 18, da der Multiplikationsoperator ("*") eine höhere Priorität hat als der Additionsoperator ("+").
Das Mischen in einem Arbeitsgang kann in einigen Fällen zu unerwarteten Ergebnissen führen. Ich empfehle, immer && zu verwenden, aber Sie haben die Wahl.
Andererseits ist "&" eine bitweise UND-Verknüpfung . Es wird zur Auswertung und Bearbeitung bestimmter Bits innerhalb des Integer-Werts verwendet.
Beispiel, wenn Sie dies tun (14 & 7), wäre das Ergebnis 6.
quelle
Wenn die Codierungsstandards für die bestimmte Codebasis, für die ich Code schreibe, angeben, welcher Operator verwendet werden soll, werde ich das definitiv verwenden. Wenn nicht, und der Code schreibt vor, welche verwendet werden sollen (nicht oft, kann leicht umgangen werden), dann werde ich das verwenden. Ansonsten wahrscheinlich
&&
.Ist es besser lesbar zu Ihnen . Die Antwort lautet Ja und Nein, abhängig von vielen Faktoren, einschließlich des Codes um den Bediener und der Person, die ihn liest!
Ja. Siehe logische Operatoren für
||
und bitweise Operatoren für~
.quelle
Ich denke, es ist Geschmackssache, obwohl das (irrtümliche) Verwechseln zu unerwünschten Verhaltensweisen führen kann:
Verwenden Sie daher && und || ist sicherer, denn sie haben die höchste Priorität. In Bezug auf die Lesbarkeit würde ich sagen, dass diese Operatoren universell genug sind.
UPDATE : Über die Kommentare, die besagen, dass beide Operationen false zurückgeben ... nun, tatsächlich gibt der obige Code nichts zurück, ich entschuldige mich 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:
Der Grund dafür
$a === true
ist, dass der Zuweisungsoperator Vorrang vor jedem logischen Operator hat, wie bereits in anderen Antworten sehr gut erläutert.quelle
Hier ist ein kleines Gegenbeispiel:
Ausgabe:
Ich würde sagen, dass diese Art von Tippfehler weitaus eher heimtückische Probleme verursacht (ähnlich wie
=
vs==
) und weitaus seltener bemerkt wird alsadn
/ro
Tippfehler, die als Syntaxfehler gekennzeichnet werden. Ich finde und / oder ist auch viel einfacher zu lesen. FWIW, die meisten PHP-Frameworks, die eine Präferenz ausdrücken (die meisten nicht), spezifizieren und / oder. Ich bin auch nie auf einen echten, nicht erfundenen Fall gestoßen, in dem es darauf angekommen wäre.quelle
Ein weiteres schönes Beispiel für die Verwendung von
if
Anweisungen ohne=
Zuweisungsoperationen.und
weil
AND
hat eine niedrigere Priorität und damit||
eine höhere Priorität.Diese unterscheiden sich in den Fällen von
true, false, false
undtrue, true, false
. Ein ausführliches Beispiel finden Sie unter https://ideone.com/lsqovs .quelle