Różnica między „! ==” a „==!” [Zamknięte]

162

Wczoraj natknąłem się na to, kiedy zmodyfikowałem kod PHP napisany przez kogoś innego. Byłem zaskoczony, że proste porównanie ( if ($var ==! " ")) nie zadziałało zgodnie z oczekiwaniami. Po kilku testach zdałem sobie sprawę, że ktokolwiek napisał ten kod, używał go ==!zamiast !==operatora porównania. Nigdy nie widziałem ==!w żadnym języku, więc zastanawiałem się, jak, do diabła, ten kod może w ogóle działać i zrobiłem kilka testów:

<?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");
?>

To daje taki wynik:

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)

Operator wydaje się działać dla zmiennych logicznych i całkowitych, ale nie dla łańcuchów. Nie mogę znaleźć ==!w dokumentacji PHP ani niczego na ten temat w żadnej wyszukiwarce (próbowałem Google, Bing, DuckDuckGo, ale podejrzewam, że próbują to zinterpretować zamiast szukać dosłownego ciągu). Czy ktoś widział to wcześniej i może rzucić trochę światła na to zachowanie?

Gerald Schneider
źródło
57
daj spokój ... o co chodzi z pozytywnymi opiniami? Mogę zadać tuzin więcej takich pytań. I towarzyszy im quasi-poważna analiza. To jest standardowa praktyka ćwiczeń podręcznikowych, nie. W SO głosujemy za jakością i informacją, a nie za zabawą i rozrywką.
sehe
51
@sehe Otrzymuje pozytywne głosy, ponieważ jest to definicja dobrze zbadanego pytania - „dokładnie szukał odpowiedzi”, „był konkretny”, pytanie jest „istotne dla innych” i jest „na temat”. OP próbował różnych rzeczy i pokazał nam, czego próbował; to rodzaj pytania, które ta strona próbuje wspierać
JRaymond,
11
@JRaymond: dostaje głosy poparcia, ponieważ jest to pytanie o ciekawostkę na bardzo łatwy do zrozumienia problem i odpowiedź. Aspekt ciekawostek zwiększa ciekawość, co napędza więcej ludzi, a aspekt łatwy zwiększa odsetek osób, które rozumieją pytanie i odpowiedź na tyle, by na nie zagłosować. Nie ma to związku z tym, że jest to dobre pytanie, czy nie.
Thomas Bonini,
4
@JRaymond, przyznaj się, większość pytań wysoko ocenianych to ciekawostki. Spójrz na te trzy moje pytania, między innymi: 1 , 2 , 3 . Żaden z nich nie jest czymś, co można po prostu znaleźć w Google (w przeciwieństwie do większości pytań, które zdobyły najwyższe głosy) i są dobrze przemyślane i wypróbowane przed napisaniem (wiem, bo je napisałem). Ponieważ jednak są to pytania wymagające specjalistycznej wiedzy, nigdy nie otrzymują wysokich głosów. Tak właśnie działa ten system.
Shahbaz,
3
@JRaymond sehe ma rację. Pisarze mieliby dzień pracy na SO. Sugerowałbym przejrzenie tej listy ( php.net/quickref.php ) i wymyślenie interesujących problemów, w których funkcja jest rozwiązaniem. Im bardziej niejasna i interesująca jest sytuacja lub funkcja, tym więcej głosów.
Mike B

Odpowiedzi:

243

Różnica polega na tym, że nie ma operatora ==!.

To wyrażenie:

$a ==! $b

Zasadniczo jest taki sam jak ten:

$a == (!$b)
Bang Dao
źródło
10
Wow, wiele dobrych odpowiedzi w tak krótkim czasie. Wybrałem pierwszą odpowiedź, która wyjaśniła, że! dotyczy zmiennej prawej ręki i dlatego ma największą wartość. Przepraszam za innych;)
Gerald Schneider
4
@Gerald Schneider: Przynajmniej mogłeś zrobić, aby to nadrobić, to ulepszyć tę odpowiedź, tak aby była co najmniej na równi z innymi odpowiedziami pod względem gramatyki i formatowania (z których jedna specjalnie wezwała do bardzo szczegółowego wyjaśnienia !). Ale nieważne, teraz to zredagowałem.
BoltClock
Nawet nie programuję w PHP i nawet zdałem sobie sprawę, że "==!" zostanie odczytane jako 2 operatory „==” i „!”. Pokazuje tylko, jak duży wpływ może mieć odrobina układu na sposób czytania.
StarNamer,
2
@Bang Dao Um, JavaScript? Ma === i! ==. Ale nie ==!
psr
2
@Banguesday Teraz znalazłeś kolejny powód dla w3fools Przeczytaj go, to ważne.
jakiś
77

W ==!PHP nie ma operatora

To tylko połączenie ==i !. Obecny jest tylko właściwy operator ==. Tak więc połączenie ==!będzie działać jak normalne ==, sprawdzające Equalityi zaufaj mi,

$variable_a ==! $variable_b 

to nikt inny niż

$variable_a == (!$variable_b)

a zatem;

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

I

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

Łączenie znaków wielu operatorów może nie zawsze działać jako operator. na przykład, jeśli weźmiemy =i !, będzie działać jako operatory tylko wtedy, gdy będzie we wzorcu !=lub !==. Nie może być wiele kombinacji dla tych znaków podoba !====, !==!etc .. etc .. kombinacje operator powinien być w wyjątkowej formie , wyjątkowej kolejności , unikalnych kombinacji (wszystkie znaki przyzwyczajenie łączyć ze wszystkimi innymi postaciami) i zdecydowanie, bez przestrzeni pomiędzy nimi .

Sprawdź listę operatorów poniżej;

wprowadź opis obrazu tutaj

Alfred
źródło
2
Wpadłem w to samo złudzenie, że mogę używać pliku <table>.
Chad Harrison,
+ prawie myślałem, że to stół ... ale w rzeczywistości jest to obraz
Baba
38

==! nie jest operatorem, ale dwoma:

== i !

! mający wyższy priorytet niż ==

Więc :

"a" !== " ": bool(true) -> prawda, ponieważ „a” tak naprawdę nie jest równe „”

"a" ==! " ": bool(false) -> fałsz, ponieważ „a” nie równa się! ""

Można zapisać ze spacją między == i!.

Michael Laffargue
źródło
1
false because "a" is not equals to !" "! "" oznacza rzutowanie na bool i negowanie, że tak "" jest prawdą, a! "" jest fałszem.
Zaffy
@quarry Tak, nie wdawałem się zbytnio w wyjaśnienie: p
Michael Laffargue
29

==!nie istnieje jako taki. To nieco tajemnicza notacja== !

Ponieważ spacje nie mają znaczenia w tych operacjach, równie łatwo możesz napisać a --> b, którego wynikiem jesta-- > b , ale będzie wyglądać dziwnie.

A więc jeśli chodzi o pytanie: "a" ==! " "zostanie przeanalizowany "a" == !" ". Negacja struny jest objęta odlewem , co oznacza dowolną strunę, ale "0"i " "jest, po rzuceniu,true .

W ten sposób wyrażenie "a" == !" "zostanie przeniesione:

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

A ponieważ string "a"to nie to samo co bool true, to oblicza całe wyrażenie na false.

Więc jaki jest morał tej historii? Nie daj się zmylić brakującymi lub nieprawidłowo umieszczonymi spacjami! :)

FP
źródło
3
w przeciwieństwie do tego, co podano w tej odpowiedzi, "a" == true daje wartość true, ponieważ niepusty łańcuch jest rzutowany na wartość logiczną prawda. Wyrażenie „a” === true dałoby wartość fałsz.
Pascal Rosin,
25

==! nie jest operatorem

==!nie jest w ogóle operatorem porównania php - jest taki sam jak == !(zwróć uwagę na spację)

To znaczy

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
źródło