Perbedaan antara "! ==" dan "==!" [Tutup]

162

Kemarin saya tersandung ini ketika saya memodifikasi kode PHP yang ditulis oleh orang lain. Saya bingung bahwa perbandingan sederhana ( if ($var ==! " ")) tidak berfungsi seperti yang diharapkan. Setelah beberapa pengujian saya menyadari bahwa siapa pun yang menulis kode yang digunakan ==!bukan !==sebagai operator perbandingan. Saya belum pernah melihat ==!dalam bahasa apa pun jadi saya bertanya-tanya bagaimana kode ini bisa bekerja dan melakukan beberapa pengujian:

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

Ini menghasilkan output ini:

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 tampaknya bekerja untuk variabel boolean dan integer, tetapi tidak untuk string. Saya tidak dapat menemukan ==!dalam dokumentasi PHP atau apa pun tentang hal itu di mesin pencari mana pun (mencoba Google, Bing, DuckDuckGo, tetapi saya curiga mereka mencoba menafsirkannya alih-alih mencari string literal). Adakah yang pernah melihat ini sebelumnya dan dapat menjelaskan perilaku ini?

Gerald Schneider
sumber
57
ayolah ... ada apa dengan upvotes? Saya bisa membuat selusin pertanyaan lagi seperti ini. Dan menemani mereka dengan analisis semu yang serius. Ini adalah latihan standar buku teks, no. Di SO, kami memilih kualitas dan informasi, bukan untuk kesenangan dan hiburan.
sehe
51
@sehe Dia mendapatkan upvotes karena definisi pertanyaan yang diteliti dengan baik - dia telah "mencari jawaban", "spesifik", pertanyaan itu "relevan dengan orang lain", dan "pada topik". OP telah mencoba berbagai hal dan menunjukkan kepada kami apa yang telah ia coba; ini adalah jenis pertanyaan yang coba dipupuk situs ini
JRaymond
11
@JRaymond: dia mendapatkan upvotes karena ini adalah pertanyaan trivia untuk masalah dan jawaban yang sangat mudah dipahami. Aspek trivia meningkatkan rasa ingin tahu yang mendorong lebih banyak orang, dan aspek mudah meningkatkan persentase orang-orang yang memahami pertanyaan dan jawaban yang cukup untuk memilihnya. Itu tidak terkait dengan itu menjadi pertanyaan yang bagus atau tidak.
Thomas Bonini
4
@JRaymond, akui saja, sebagian besar pertanyaan suara terbanyak adalah trivia. Lihatlah tiga pertanyaan saya di antara banyak pertanyaan lain: 1 , 2 , 3 . Tak satu pun dari mereka adalah sesuatu yang bisa Anda temukan di google (tidak seperti kebanyakan pertanyaan suara tinggi) dan mereka dipikirkan dan dicoba sebelum ditulis (saya tahu, karena saya menulisnya). Namun, karena mereka adalah pertanyaan yang membutuhkan keahlian, mereka tidak pernah mendapatkan suara tinggi. Begitulah cara sistem di sini bekerja.
Shahbaz
3
@Jaymond sehe benar. Penulis akan menjalani hari-lapangan di SO. Saya sarankan turun daftar ini ( php.net/quickref.php ) dan muncul dengan masalah yang menarik di mana fungsi adalah solusinya. Semakin tidak jelas dan menarik situasi atau fungsi semakin banyak suara.
Mike B

Jawaban:

243

Perbedaannya adalah tidak ada operator ==!.

Ungkapan ini:

$a ==! $b

Pada dasarnya sama dengan ini:

$a == (!$b)
Bang Dao
sumber
10
Wow, banyak jawaban bagus dalam waktu singkat. Saya memilih jawaban pertama yang menjelaskan bahwa! berlaku untuk variabel kanan dan karenanya memiliki nilai terbanyak. Maaf untuk yang lain;)
Gerald Schneider
4
@Gerald Schneider: Paling tidak yang bisa Anda lakukan untuk menebusnya adalah meningkatkan jawaban ini sehingga setidaknya setara dengan jawaban lain dalam hal tata bahasa dan format (salah satu yang secara khusus Anda panggil untuk penjelasannya yang sangat rinci !). Tapi tidak masalah, saya sudah mengeditnya sekarang.
BoltClock
Saya bahkan tidak memprogram dalam PHP dan bahkan saya menyadari bahwa "==!" akan dibaca sebagai 2 operator "==" dan "!". Itu hanya menunjukkan seberapa banyak efek sedikit tata letak dapat memiliki pada bagaimana Anda membaca sesuatu.
StarNamer
2
@ Bang Dao Um, JavaScript? Ini memiliki === dan! ==. Tapi tidak ==!
psr
2
@BangDao Sekarang Anda menemukan alasan lain untuk w3fools Harap baca, ini penting.
beberapa
77

Tidak ada ==!operator di PHP

Hanya kombinasi ==dan !. Hanya operator yang relevan yang hadir di sini ==. Jadi kombinasi ==!akan berfungsi seperti biasa ==, memeriksa Equality, dan percaya padaku,

$variable_a ==! $variable_b 

tidak lain adalah

$variable_a == (!$variable_b)

dan dengan demikian;

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

Dan

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

Menggabungkan beberapa karakter operator mungkin tidak selalu berfungsi sebagai operator. misalnya, jika kita ambil =dan !, itu akan berfungsi sebagai operator hanya jika itu dalam pola !=atau !==. Ada dapat banyak kombinasi untuk karakter ini seperti !====, !==!dll .. dll .. kombinasi Operator harus dalam format yang unik , agar unik , kombinasi yang unik (semua karakter wont menggabungkan dengan semua karakter lain) dan pasti, tanpa ruang antara mereka .

Periksa daftar operator di bawah ini;

masukkan deskripsi gambar di sini

alfred
sumber
2
Saya jatuh di bawah ilusi yang sama untuk dapat menggunakan a <table>.
Chad Harrison
+ hampir mengira itu adalah meja ... tetapi sebenarnya itu adalah sebuah gambar
Baba
38

==! bukan operator melainkan dua:

== dan !

! memiliki prioritas lebih tinggi daripada ==

Jadi:

"a" !== " ": bool(true) -> benar karena "a" benar-benar tidak sama dengan ""

"a" ==! " ": bool(false) -> salah karena "a" tidak sama dengan! ""

Dapat ditulis dengan spasi antara == dan!.

Michael Laffargue
sumber
1
false because "a" is not equals to !" "! "" artinya dilemparkan ke bool dan meniadakan bahwa "" itu benar dan! "" salah.
Zaffy
@quarry Ya saya tidak terlalu banyak menjelaskan: p
Michael Laffargue
29

==!tidak ada seperti itu. Ini adalah notasi yang agak samar== !

Karena spasi tidak penting dalam operasi itu, Anda bisa dengan mudah menulis a --> b, yang dievaluasi a-- > b, tetapi akan terlihat aneh.

Jadi, untuk pertanyaan: "a" ==! " "akan diuraikan "a" == !" ". Negasi dari suatu string ditutupi oleh casting , berarti string apa pun kecuali "0"dan " "adalah, ketika dicor true,.

Dengan demikian, ekspresi "a" == !" "akan ditransfer:

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

Dan, karena string "a"tidak sama dengan bool true, ini mengevaluasi seluruh ekspresi false.

Jadi, apa moral dari cerita ini? Jangan biarkan diri Anda bingung dengan ruang yang hilang atau salah tempat! :)

FP
sumber
3
tidak seperti yang dinyatakan dalam jawaban ini, "a" == true mengevaluasi true karena string yang tidak kosong dilemparkan ke nilai boolean true. Ekspresi "a" === true akan bernilai false.
Pascal Rosin
25

==! bukan operator

==!sama sekali bukan operator perbandingan php - ini sama dengan == !(perhatikan spasi)

Yaitu

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
sumber