Ich habe eine Codebasis, für deren Verwendung sich Entwickler entschieden haben AND und OR anstatt && und ||.
Ich weiß, dass es einen Unterschied in der Priorität der Operatoren gibt (&& geht vor and), aber mit dem gegebenen Rahmen (PrestaShop um genau zu sein) ist es eindeutig kein Grund.
Welche Version verwendest du? Ist and besser lesbar als &&? Oder gibt es keinen Unterschied?
Beachten Sie, dass ~ ist der bitweise NOT-Operator und nicht der logische. 😉
– Gumbo
10. Mai 2010 um 14:26 Uhr
Ja, ich weiß. Schlechte Angewohnheiten 🙂 . Es ist ein bisschen seltsam, dass es in PHP ‘and’, ‘or’ und ‘xor’ gibt, aber kein ‘not’, oder?
– ts.
12. Mai 2010 um 10:30 Uhr
@ts: Die richtige Antwort hier ist die von R. Bemrose bereitgestellte stackoverflow.com/questions/2803321/and-vs-as-operator/…
– Marco Demaio
24. Mai 2011 um 15:45 Uhr
! ist der logische Not-Operator
– Messersturm
30. Mai 2011 um 8:15 Uhr
@chiliNUT ganz richtig. Damals muss es Sinn gemacht haben. Sieht so aus, als wäre die lauernde falsche Antwort an dieser Stelle bestraft worden 🙂
– Doppeljosch
28. März 2014 um 19:34 Uhr
Machtherr
Wenn du benutzt AND und ORwirst du irgendwann über so etwas stolpern:
Wenn du gesagt hättest false… bzzzt, sorry, falsch!
$truthiness oben hat den Wert true. Warum? = hat ein höheren Vorrang als and. Das Hinzufügen von Klammern zur Darstellung der impliziten Reihenfolge macht dies klarer:
($truthiness = $this_one) and $that
Wenn Sie verwendet haben && anstatt and Im ersten Codebeispiel würde es wie erwartet funktionieren und sein false.
Wie in den Kommentaren unten besprochen, funktioniert dies auch, um den richtigen Wert zu erhalten, da Klammern eine höhere Priorität haben als =:
$truthiness = ($this_one and $that)
+1: Dies sollte in der PHP-Dokumentation laut und deutlich gemacht werden, oder PHP sollte sich ändern und diesen Operatoren oder DEPRECATE denselben Vorrang einräumen andor ein für alle Mal. Ich habe zu viele Leute gesehen, die dachten, sie seien genau dasselbe, und die Antworten hier sind mehr Erfahrungsberichte.
– Marco Demaio
24. Mai 2011 um 15:44 Uhr
Tatsächlich haben auch andere Sprachen (z. B. Perl und Ruby) diese Varianten mit der gleichen Präzedenzunterscheidung, sodass es nicht sinnvoll wäre, von diesem Standard abzuweichen (so verwirrend es für Anfänger sein mag), indem die Präzedenz in PHP gleich gemacht wird. Ganz zu schweigen von der Abwärtskompatibilität von unzähligen PHP-Anwendungen.
– Mladen Jablanovic
25. Januar 2012 um 8:27 Uhr
Die Unfähigkeit der Leute, die Dokumentation für eine Sprache zu lesen, macht die Entscheidungen der Sprache nicht falsch. Wie Mladen anmerkt, verwenden auch Perl und Ruby diese zusätzlichen Operatoren, und zwar mit denselben Vorrangigkeiten. Es ermöglicht Konstrukte wie z $foo and bar(), die nette Abkürzungen für if-Anweisungen sind. Wenn unerwartetes Verhalten (durch schlechte Dokumentation oder Nichtlesen) ein Grund wäre, etwas nicht zu verwenden, würden wir überhaupt nicht über die Verwendung von PHP sprechen.
– Altreus
30. August 2012 um 11:49 Uhr
Ich habe 3 Minuten gebraucht, um die falsche Zeile zu finden: $das = wahr🙁 und was ist mit $truthiness = ($this and $that); für mich sieht es besser aus 🙂
– Dmitri Kozmenko
6. Mai 2013 um 15:52 Uhr
Ich stimme Dmitriy zu – das Umschließen der booleschen Auswertung in Klammern hilft, die Absicht des Codes zu verdeutlichen. Ich denke, der Operator und seine Funktion, wie sie jetzt existieren, sind wertvoll und konsistent mit anderen Sprachen, es ist die Aufgabe des Programmierers, die Sprache zu verstehen.
// "||" 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 Entwicklergeschmacks zu sein, wie jedes Vorkommen davon, das ich im CodeIgniter-Framework gesehen habe, wie @Sarfraz erwähnt hat.
Es ist erwähnenswert, dass das „true“ nicht ignoriert wird, wenn dieser Ausdruck Teil einer größeren Anweisung ist. Betrachten Sie den Fall if ($f = false or true) $f = true; – das Ergebnis wäre das $f wird am Ende wahr, weil der Ausdruck insgesamt als wahr ausgewertet wird.
– Chris Browne
15. März 2012 um 22:04 Uhr
nein, du hast die Variable später einfach überschrieben. der Ausdruck immer noch als falsch ausgewertet wird, dann überschreiben Sie ihn in der nächsten Zeile mit wahr.
– r3wt
13. Mai 2014 um 21:50 Uhr
Eigentlich hatte er recht. Zuerst, $f wird falsch zugewiesen – aber die Bedingung wird als wahr ausgewertet, also dann $f wird überschrieben. Wenn die Bedingung als falsch bewertet wird, $f würde so oder so nie überschrieben werden.
– ahouse101
29. Juni 2014 um 23:58 Uhr
Es ist lächerlich zu behaupten, die Entwickler sollten ihrem eigenen Geschmack folgen. Vergessen Sie den Albtraum eines anderen Entwicklers, der versucht, denselben Code zu pflegen. Der Entwickler, der den Code selbst geschrieben hat, würde semantische Fehler in jedem Code machen, der geschrieben wurde, weil er/sie es vorgezogen hat and über &&wo and funktioniert wie erwartet in nur einigen Situationen und && funktioniert wie erwartet in allen Situationen.
– ADTC
7. September 2018 um 19:49 Uhr
Seit and hat einen niedrigeren Vorrang als = Sie können es in der Bedingungszuweisung 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 setze ich meine Vergleiche immer in Klammern und platziere sie. Auf diese Weise muss ich mich nicht auf die Operatorpriorität verlassen:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
arviman
Vorrang unterscheidet sich zwischen && und und (&& hat Vorrang vor und), was in Kombination mit einem ternären Operator zu Verwirrung führt. Zum Beispiel,
$predA && $predB ? "foo" : "bar"
wird a zurückgeben Schnur wohingegen
$predA and $predB ? "foo" : "bar"
wird a zurückgeben boolesch.
Mahmoud Zalt
Lassen Sie mich den Unterschied zwischen “und” – “&&” – “&” erklären.
“&&” und “and” sind beides logische UND-Verknüpfungen und sie tun dasselbe, aber die Operatorpriorität ist unterschiedlich.
Der Vorrang (Priorität) eines Operators gibt an, wie “fest” er zwei Ausdrücke miteinander verbindet. Im Ausdruck 1 + 5 * 3 ist die Antwort beispielsweise 16 und nicht 18, da der Multiplikationsoperator (“*”) eine höhere Priorität hat als der Additionsoperator (“+”).
Das Mischen in einem einzigen Vorgang kann in einigen Fällen zu unerwarteten Ergebnissen führen
Ich empfehle, immer && zu verwenden, aber das ist Ihre Wahl.
Andererseits ist “&” ein bitweise UND-Verknüpfung. Es wird für die Auswertung und Manipulation bestimmter Bits innerhalb des ganzzahligen Werts verwendet.
Beispiel: Wenn Sie (14 & 7) machen, wäre das Ergebnis 6.
7 = 0111
14 = 1110
------------
= 0110 == 6
Salat
welche Version verwendest du?
Wenn die Codierungsstandards für die bestimmte Codebasis, für die ich Code schreibe, angeben, welcher Operator verwendet werden sollte, werde ich es tun bestimmt verwende das. Wenn nicht, und der Code diktiert was verwendet werden sollte (nicht oft, kann leicht umgangen werden), dann werde ich das verwenden. Andernfalls, wahrscheinlich&&.
Ist ‘and’ besser lesbar als ‘&&’?
Ist es besser lesbar für dich. Die Antwort ist Ja und nein hängt von vielen Faktoren ab, einschließlich des Codes um den Bediener und tatsächlich die Person, die ihn liest!
Beachten Sie, dass
~
ist der bitweise NOT-Operator und nicht der logische. 😉– Gumbo
10. Mai 2010 um 14:26 Uhr
Ja, ich weiß. Schlechte Angewohnheiten 🙂 . Es ist ein bisschen seltsam, dass es in PHP ‘and’, ‘or’ und ‘xor’ gibt, aber kein ‘not’, oder?
– ts.
12. Mai 2010 um 10:30 Uhr
@ts: Die richtige Antwort hier ist die von R. Bemrose bereitgestellte stackoverflow.com/questions/2803321/and-vs-as-operator/…
– Marco Demaio
24. Mai 2011 um 15:45 Uhr
! ist der logische Not-Operator
– Messersturm
30. Mai 2011 um 8:15 Uhr
@chiliNUT ganz richtig. Damals muss es Sinn gemacht haben. Sieht so aus, als wäre die lauernde falsche Antwort an dieser Stelle bestraft worden 🙂
– Doppeljosch
28. März 2014 um 19:34 Uhr