Unterschied zwischen "! ==" und "==!" [geschlossen]

162

Gestern bin ich darüber gestolpert, als ich PHP-Code geändert habe, der von jemand anderem geschrieben wurde. Ich war verblüfft, dass ein einfacher Vergleich ( if ($var ==! " ")) nicht wie erwartet funktionierte. Nach einigen Tests wurde mir klar, dass derjenige, der diesen Code schrieb, ihn ==!nicht !==als Vergleichsoperator verwendete. Ich habe noch nie ==!in einer Sprache gesehen, also habe ich mich gefragt, wie zum Teufel dieser Code überhaupt funktionieren könnte, und einige Tests durchgeführt:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

Dies erzeugt diese Ausgabe:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

Der Operator scheint für boolesche und ganzzahlige Variablen zu funktionieren, nicht jedoch für Zeichenfolgen. Ich kann ==!in der PHP-Dokumentation oder in einer Suchmaschine nichts darüber finden (versucht Google, Bing, DuckDuckGo, aber ich vermute, sie versuchen, es zu interpretieren, anstatt nach der wörtlichen Zeichenfolge zu suchen). Hat das schon jemand gesehen und kann dieses Verhalten beleuchten?

Gerald Schneider
quelle
57
Komm schon ... was ist mit den Upvotes? Ich kann noch ein Dutzend solcher Fragen stellen. Und begleiten Sie sie durch eine quasi ernsthafte Analyse. Dies ist die übliche Übungspraxis für Lehrbücher, Nr. In SO stimmen wir für Qualität und Information, nicht für Spaß und Unterhaltung.
sehe
51
@sehe Er bekommt positive Stimmen, weil es die Definition einer gut recherchierten Frage ist - er hat "gründlich nach einer Antwort gesucht", "war spezifisch", die Frage ist "relevant für andere" und ist "thematisch". Das OP hat Dinge ausprobiert und uns gezeigt, was er versucht hat. Es ist die Art von Frage, die diese Seite zu fördern versucht
JRaymond
11
@JRaymond: Er bekommt positive Stimmen, weil es eine triviale Frage für ein sehr leicht verständliches Problem und eine Antwort ist. Der Trivia-Aspekt erhöht die Neugier, die mehr Menschen antreibt, und der einfache Aspekt erhöht den Prozentsatz derjenigen Personen, die die Frage und die Antwort genug verstehen, um darüber abzustimmen. Es hängt nicht damit zusammen, ob es eine gute Frage ist oder nicht.
Thomas Bonini
4
@JRaymond, gib es zu, die meisten Fragen mit hohen Stimmen sind Trivia. Schauen Sie sich unter anderem diese drei Fragen an: 1 , 2 , 3 . Keiner von ihnen ist etwas, das man nur bei Google finden kann (im Gegensatz zu den meisten Fragen mit hohen Stimmen), und sie sind gut durchdacht und ausprobiert, bevor sie geschrieben werden (ich weiß, weil ich sie geschrieben habe). Da es sich jedoch um Fragen handelt, die Fachwissen erfordern, erhalten sie niemals hohe Stimmen. So funktioniert das System hier.
Shahbaz
3
@JRaymond sehe ist richtig. Autoren würden einen Feldtag auf SO haben. Ich würde vorschlagen, diese Liste ( php.net/quickref.php ) durchzugehen und interessante Probleme zu finden, bei denen die Funktion die Lösung ist. Je dunkler und interessanter die Situation oder Funktion ist, desto mehr Stimmen.
Mike B

Antworten:

243

Der Unterschied besteht darin, dass es keinen Operator gibt ==!.

Dieser Ausdruck:

$a ==! $b

Ist im Grunde das gleiche wie das:

$a == (!$b)
Bang Dao
quelle
10
Wow, viele gute Antworten in so kurzer Zeit. Ich wählte die erste Antwort, die klarstellte, dass die! gilt für die rechte Variable und hat daher den größten Wert. Entschuldigung für die anderen Jungs;)
Gerald Schneider
4
@Gerald Schneider: Das Mindeste, was Sie tun konnten, um dies auszugleichen, war, diese Antwort so zu verbessern, dass sie in Bezug auf Grammatik und Formatierung mindestens den anderen Antworten ebenbürtig war (eine davon haben Sie ausdrücklich für ihre sehr detaillierte Erklärung genannt !). Aber egal, ich habe es jetzt bearbeitet.
BoltClock
Ich programmiere nicht einmal in PHP und selbst mir wurde klar, dass "==!" würde als die 2 Operatoren "==" und "!" gelesen werden. Es zeigt nur, wie viel Einfluss ein wenig Layout auf das Lesen haben kann.
StarNamer
2
@ Bang Dao Um, JavaScript? Es hat === und! ==. Aber nein ==!
Psr
2
@ BangDao Jetzt hast du einen anderen Grund für w3fools gefunden. Bitte lies es, es ist wichtig.
einige
77

==!In PHP gibt es keinen Operator

Es ist nur eine Kombination aus ==und !. Hier ist nur der relevante Betreiber anwesend ==. Die Kombination ==!funktioniert also wie gewohnt ==, überprüft Equalityund vertraut mir.

$variable_a ==! $variable_b 

ist kein anderer als

$variable_a == (!$variable_b)

und somit;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

Und

true ==! false: bool(true)
true ==! true: bool(false)

Das Kombinieren mehrerer Operatorzeichen funktioniert möglicherweise nicht immer als Operator. wenn wir zum Beispiel nehmen =und !wird es als Betreiber nur funktionieren , wenn es in dem Muster ist !=oder !==. Es kann wie zahlreiche Kombinationen für diese Zeichen !====, !==!etc .. etc .. Operator Kombinationen in sein sollten einzigartiges Format , einzigartige Reihenfolge , einzigartige Kombinationen (alle Zeichen würden nicht kombinieren mit allen anderen Zeichen) und auf jedem Fall, ohne Raum zwischen ihnen .

Überprüfen Sie die Bedienerliste unten;

Geben Sie hier die Bildbeschreibung ein

Alfred
quelle
2
Ich fiel unter die gleiche Illusion, a benutzen zu können <table>.
Chad Harrison
+ dachte fast, das wäre ein Tisch ... aber es ist eigentlich ein Bild
Baba
38

==! ist kein Operator, sondern zwei:

== und !

! mit einer höheren Priorität als ==

So :

"a" !== " ": bool(true) -> wahr, weil "a" wirklich nicht gleich "" ist

"a" ==! " ": bool(false) -> false, weil "a" nicht gleich ist! ""

Könnte mit einem Leerzeichen zwischen == und! Geschrieben werden.

Michael Laffargue
quelle
1
false because "a" is not equals to !" "! "" bedeutet gegossen, um das zu boolen und zu negieren, also "" ist wahr und! "" ist falsch.
Zaffy
@quarry Ja, ich bin nicht zu viel in die Erklärung
gegangen
29

==!existiert nicht als solche. Es ist eine etwas kryptische Notation von== !

Da Leerzeichen bei diesen Operationen keine Rolle spielen, können Sie genauso einfach schreiben a --> b, was ausgewertet wird a-- > b, aber seltsam aussieht.

Also, was die Frage "a" ==! " "betrifft : wird analysiert "a" == !" ". Negierung einer Zeichenkette wird durch abgedeckt Gießen , was bedeutet , eine beliebige Zeichenfolge aber "0"und " "ist, wenn gegossen, true.

Somit wird der Ausdruck "a" == !" "übertragen:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

Und da dies string "a"nicht dasselbe ist bool true, bewertet dies den gesamten Ausdruck zu false.

Also, was ist die Moral der Geschichte? Lassen Sie sich nicht durch fehlende oder falsch platzierte Leerzeichen verwirren! :) :)

FP
quelle
3
Im Gegensatz zu dieser Antwort wird "a" == true als true ausgewertet, da eine nicht leere Zeichenfolge in den booleschen Wert true umgewandelt wird. Der Ausdruck "a" === true würde als false ausgewertet.
Pascal Rosin
25

==! ist kein Operator

==!ist überhaupt kein PHP-Vergleichsoperator - es ist dasselbe wie == !(beachten Sie das Leerzeichen)

Dh

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
AD7six
quelle