Differenza tra “! ==” e “==!” [chiuso]


162

Ieri mi sono imbattuto in questo quando ho modificato il codice PHP scritto da qualcun altro. Ero sconcertato dal fatto che un semplice confronto ( if ($var ==! " ")) non funzionasse come previsto. Dopo alcuni test mi sono reso conto che chiunque ha scritto quel codice ha usato ==!invece !==come operatore di confronto. Non ho mai visto ==!in nessuna lingua, quindi mi chiedevo come diavolo potesse funzionare questo codice e ho fatto dei test:

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

Questo produce questo output:

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)

L'operatore sembra funzionare per variabili booleane e intere, ma non per stringhe. Non riesco a trovare ==!nella documentazione di PHP o nulla al riguardo su nessun motore di ricerca (provato Google, Bing, DuckDuckGo, ma sospetto che provino a interpretarlo invece di cercare la stringa letterale). Qualcuno l'ha mai visto prima e può fare luce su questo comportamento?


57
dai ... che succede con i voti? Posso fare una dozzina di altre domande come questa. E accompagnarli con analisi quasi serie. Questa è una pratica di esercizi standard per libri di testo, no. In SO, votiamo per qualità e informazione, non per divertimento e intrattenimento.
Visto il

51
@sehe Sta ottenendo voti perché è la definizione di una domanda ben studiata - ha "cercato accuratamente una risposta", "è stato specifico", la domanda è "rilevante per gli altri", ed è "sull'argomento". l'OP ha provato le cose e ci ha mostrato ciò che ha provato; è il tipo di domanda che questo sito cerca di favorire
JRaymond,

11
@JRaymond: sta ricevendo voti perché è una domanda banale per un problema e una risposta molto facili da capire. L'aspetto curioso aumenta la curiosità che spinge più persone a entrare, e l'aspetto facile aumenta la percentuale di quelle persone che comprendono la domanda e la risposta sufficiente per votarla. Non è collegato al fatto che sia una buona domanda o no.
Thomas Bonini,

4
@JRaymond, ammettilo, la maggior parte delle domande più importanti sono curiosità. Dai un'occhiata a queste mie tre domande, tra le altre: 1 , 2 , 3 . Nessuno di loro è qualcosa che potresti trovare su google (a differenza della maggior parte delle domande di voto positivo) e sono ben ponderati e provati prima di essere scritti (lo so, perché li ho scritti). Tuttavia, poiché sono domande che richiedono competenza, non ottengono mai voti alti. Ecco come funziona il sistema qui.
Shahbaz,

3
@JRaymond sehe ha ragione. Gli scrittori avrebbero avuto una giornata campale su SO. Suggerirei di andare in fondo a questo elenco ( php.net/quickref.php ) e di trovare interessanti problemi in cui la funzione è la soluzione. Più oscura e interessante è la situazione o la funzione, più voti.
Mike B,

Risposte:


243

La differenza è che non esiste un operatore ==!.

Questa espressione:

$a ==! $b

È sostanzialmente lo stesso di questo:

$a == (!$b)

10
Caspita, molte buone risposte in così poco tempo. Ho scelto la prima risposta che ha chiarito che il! si applica alla variabile di destra e quindi ha il massimo valore. Ci scusiamo per gli altri ragazzi;)
Gerald Schneider

4
@Gerald Schneider: il minimo che puoi fare per compensare è stato migliorare questa risposta in modo che fosse almeno alla pari con le altre risposte in termini di grammatica e formattazione (una delle quali hai specificamente richiesto per la sua spiegazione molto dettagliata !). Ma non importa, l'ho modificato ora.
BoltClock

Non ho nemmeno programmato in PHP e nemmeno mi sono reso conto che "==!" verrebbero letti come i 2 operatori "==" e "!". Mostra solo l'effetto che può avere un po 'di layout sul modo in cui leggi qualcosa.
StarNamer,

2
@Bang Dao Um, JavaScript? Ha === e! ==. Ma no ==!
psr

2
@BangDao Ora hai trovato un altro motivo per w3fools Per favore, leggilo, è importante.
un po '

77

Non esiste un ==!operatore in PHP

È solo una combinazione di ==e !. Solo l'operatore rilevante presente qui è ==. Quindi la combinazione ==!funzionerà come un normale ==, controllando Equalitye fidati di me,

$variable_a ==! $variable_b 

non è altro che

$variable_a == (!$variable_b)

e quindi;

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

E

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

La combinazione di più operatori di caratteri potrebbe non funzionare sempre come operatore. per esempio, se prendiamo =e !, funzionerà come operatori solo se è nel modello di !=o !==. Ci possono essere numerose combinazioni di questi personaggi come !====, !==!ecc .. ecc .. combinazioni operatore deve essere in formato unico , ordine unico , combinazioni uniche (tutti i caratteri suole si combinano con tutti gli altri caratteri) e definitivamente, senza spazio tra di loro .

Controlla l'elenco degli operatori qui sotto;

inserisci qui la descrizione dell'immagine


2
Sono caduto nella stessa illusione di poter usare a <table>.
Chad Harrison,

+ quasi pensato che fosse un tavolo ... ma in realtà è un'immagine
Baba

38

==! non è un operatore ma due:

== e !

! avere una priorità più alta di ==

Così :

"a" !== " ": bool(true) -> vero perché "a" non è realmente uguale a ""

"a" ==! " ": bool(false) -> false perché "a" non è uguale a! ""

Potrebbe essere scritto con uno spazio tra == e!.


1
false because "a" is not equals to !" "! "" significa cast per bool e negare che così "" è vero e! "" è falso.
Zaffy,

@quarry Sì, non sono andato troppo all'interno della spiegazione: p
Michael Laffargue,

29

==!non esiste come tale. È una notazione in qualche modo criptica di== !

Poiché gli spazi non contano in quelle operazioni, potresti scrivere altrettanto facilmente a --> b, cosa che valuta a-- > b, ma sembrerà strano.

Quindi, per quanto riguarda la domanda: "a" ==! " "verrà analizzato "a" == !" ". Negazione di una stringa è coperto da fusione , il che significa una stringa qualsiasi, ma "0"e " "è, quando colato, true.

Pertanto, l'espressione "a" == !" "verrà trasferita:

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

E, poiché string "a"non è la stessa bool true, questo valuta l'intera espressione false.

Allora, qual è la morale della storia? Non lasciarti confondere da spazi mancanti o sbagliati! :)


3
a differenza di quanto indicato in questa risposta, "a" == true restituisce true poiché una stringa non vuota viene trasmessa al valore booleano true. L'espressione "a" === true sarebbe valutata su false.
Pascal Rosin,

25

==! non è un operatore

==!non è affatto un operatore di confronto php - è lo stesso di == !(nota lo spazio)

ie

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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.