it-swarm.com.de

'AND' vs '&&' als Operator

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

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 dies offensichtlich kein Grund.

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

263
ts.

Wenn Sie AND und OR verwenden, werden Sie letztendlich durch Folgendes ausgelöst:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

Möchten Sie erraten, was $truthiness entspricht?

Wenn Sie false... bzzzt gesagt haben, entschuldigen Sie, falsch!

$truthiness oben hat den Wert true. Warum? = hat eine höhere Priorität als and. Das Hinzufügen von Klammern zur Anzeige der impliziten Reihenfolge macht dies klarer:

($truthiness = $this_one) and $that

Wenn Sie im ersten Codebeispiel && anstelle von and verwendet haben, würde dies wie erwartet funktionieren und false sein.

Wie in den Kommentaren unten erläutert, funktioniert dies auch, um den korrekten Wert zu erhalten, da Klammern eine höhere Priorität haben als =:

$truthiness = ($this_one and $that)
602
Powerlord

Je nachdem, wie es verwendet wird, kann es notwendig und sogar praktisch sein . http://php.net/manual/de/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;

In den meisten Fällen scheint es jedoch eher eine Geschmackssache für Entwickler zu sein, wie jedes Vorkommen, das ich im CodeIgniter-Framework wie @Sarfraz erwähnt habe.

40
adamJLev

Da and eine niedrigere Priorität als = hat, können Sie es in der Zuweisung von Bedingungen 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
9
Justinas

Zur Sicherheit stelle ich meine Vergleiche immer in Klammern und räume sie aus. Auf diese Weise muss ich mich nicht auf die Rangfolge der Operatoren verlassen:

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

Die Rangfolge unterscheidet sich zwischen && und und (&& hat eine höhere Priorität als und), was in Verbindung mit einem ternären Operator zu Verwirrung führt. Zum Beispiel,

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

wird ein string zurückgeben

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

gibt ein boolean zurück.

8
arviman

welche Version verwendest du?

Wenn die Codierungsstandards für die bestimmte Codebase, für die ich Code schreibe, den Operator angeben, der verwendet werden soll, verwende ich definitiv. Wenn nicht, und der Code diktiert, der verwendet werden soll (nicht oft, kann leicht umgangen werden), dann werde ich das verwenden. Ansonsten wahrscheinlich&&.

Ist 'und' besser lesbar als '&&'?

Ist es lesbarer für Sie. Die Antwort ist ja und nein abhängig von vielen Faktoren, einschließlich des Codes um den Operator und der Person, die ihn liest!

|| da ist ~ unterschied

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

1
salathe

Lassen Sie mich den Unterschied zwischen "und" - "&&" - "&" erklären.

"&&" und "und" sind beide logische AND-Operationen und sie tun dasselbe, aber der Operator-Vorrang ist unterschiedlich.

Der Vorrang (die Priorität) eines Operators legt fest, wie "fest" zwei Ausdrücke miteinander verbunden werden. In dem Ausdruck 1 + 5 * 3 lautet die Antwort beispielsweise 16 und nicht 18, da der Multiplikationsoperator ("*") eine höhere Priorität hat als der Additionsoperator ("+").

Wenn Sie diese in einem einzigen Vorgang mischen, kann dies in einigen Fällen zu unerwarteten Ergebnissen führen Ich empfehle immer, && zu verwenden, aber das ist Ihre Wahl.


Andererseits ist "&" eine bitweise AND-Operation. Es wird zur Auswertung und Bearbeitung bestimmter Bits innerhalb des ganzzahligen Werts verwendet.

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

7   = 0111
14  = 1110
------------
    = 0110 == 6
1
Mahmoud Zalt

Abhängig von der verwendeten Sprache ist es in der Regel besser, && und || anstelle von and und or zu verwenden, außer in Sprachen wie Python, wo stattdessen and und or verwendet werden und && und || nicht existieren.

0
Aryan Beezadhur

Ein weiteres Nice-Beispiel mit if-Anweisungen ohne =-Zuweisungsoperationen.

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 hat.

Dies ist in den Fällen von true, false, false und true, true, false..__ unterschiedlich. Siehe https://ideone.com/lsqovs für ein ausführliches Beispiel.

0
Ken

Ich denke, es ist eine Frage des Geschmacks, obwohl (irrtümlicherweise) das Aufmischen einige unerwünschte Verhaltensweisen verursachen kann:

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

true and false || false; // returns true

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 ... na ja, in der Tat liefert der obige Code nichts, ich entschuldige mich für die Mehrdeutigkeit. Zur Klarstellung: Das Verhalten im zweiten Fall hängt davon ab, wie das Ergebnis der Operation verwendet wird. Beobachten Sie, wie der Vorrang von Operatoren hier zum Tragen kommt:

var_dump(true and false || false); // bool(false)

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

Der Grund für $a === true liegt darin, dass der Zuweisungsoperator Vorrang vor jedem logischen Operator hat, wie bereits in anderen Antworten sehr gut erläutert.

0
nuqqsa

Hier ist ein kleines Gegenbeispiel:

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

ausgabe:

bool(false)

Ich würde sagen, diese Art von Tippfehler verursacht weitaus mehr heimtückische Probleme (ähnlich wie = vs. ==) und ist weit weniger wahrscheinlich als adn/ro Tippfehler, die als Syntaxfehler gekennzeichnet werden. Ich finde auch und/oder ist viel einfacher zu lesen. FWIW, die meisten PHP -Frameworks, die eine Präferenz ausdrücken (die meisten nicht) angeben und/oder. Ich bin auch nie in einen echten, nicht konstruierten Fall geraten, in dem es eine Rolle gespielt hätte.

0
Synchro