“! ==” ve “==!” Arasındaki fark [kapalı]


162

Başka birinin yazdığı PHP kodunu değiştirdiğimde dün bunu tökezledim. Ben basit bir karşılaştırma ( if ($var ==! " ")) beklendiği gibi çalışmadığı şaşırdı. Bazı test ettikten sonra ben bu kodu kim yazdıysa, kullanılan fark ==!yerine !==karşılaştırılması operatörü olarak. Ben ==!herhangi bir dilde hiç görmedim , bu yüzden bu kodun nasıl çalıştığını merak ettim ve bazı testler yaptım:

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

Bu şu çıktıyı üretir:

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)

İşleç boole ve tamsayı değişkenleri için çalışıyor, ancak dizeler için çalışmıyor gibi görünüyor. ==!PHP belgelerinde veya herhangi bir arama motorunda bu konuda bir şey bulamıyorum (denenmiş Google, Bing, DuckDuckGo, ancak tam dizeyi aramak yerine yorumlamaya çalıştıklarından şüpheleniyorum). Bunu daha önce gören ve bu davranışa ışık tutabilecek olan var mı?


57
hadi ... upvotes ile nedir? Bunun gibi bir düzine soru daha sorabilirim. Ve ciddi bir analizle onlara eşlik edin. Bu standart ders kitabı alıştırma uygulaması, hayır. SO'da, eğlence ve eğlence için değil, kalite ve bilgi için oy kullanıyoruz.
sehe

51
@sehe İyi bir şekilde araştırılmış bir sorunun tanımı olduğu için oylar alıyor - "iyice bir cevap aradı", "spesifik", soru "diğerleriyle alakalı" ve "konuyla ilgili". OP bir şeyler denedi ve bize ne denediğini gösterdi; Bu tür bir site teşvik etmeye çalıştığı soru tür
JRaymond

11
@JRaymond: o oyları alıyor çünkü bu sorunun anlaşılması ve cevaplanması çok kolay bir soru. Trivia yönü, daha fazla insanı harekete geçiren merakı artırır ve kolay yönü, soruyu anlayan insanların yüzdesini ve ona oy vermek için yeterli cevabı artırır. Bunun iyi bir soru olması ya da olmaması ile ilgili değildir.
Thomas Bonini

4
@JRaymond, itiraf et, yüksek oy kullanan soruların çoğu önemsiz şeyler. Diğer üç soru arasında bu üç soruma bir göz atın: 1 , 2 , 3 . Hiçbiri google'da bulabileceğiniz bir şey değil (en yüksek oy kullanan soruların aksine) ve iyi düşünülmüş ve yazılmadan önce denenmiştir (Biliyorum, çünkü onları yazdım). Ancak, uzmanlık gerektiren sorular oldukları için asla yüksek oy almazlar. Buradaki sistem böyle çalışır.
Shahbaz

3
@JRaymond sehe haklı. Yazarlar SO'da bir gün geçireceklerdi. Bu listeye ( php.net/quickref.php ) inmeyi ve işlevin çözüm olduğu ilginç problemlerle gelmenizi öneririm . Durum veya işlev ne kadar belirsiz ve ilginç olursa o kadar çok oy kullanılır.
Mike B

Yanıtlar:


243

Fark, operatör olmamasıdır ==!.

Bu ifade:

$a ==! $b

Temel olarak bununla aynıdır:

$a == (!$b)

10
Vay be, bu kadar kısa sürede çok iyi cevaplar. Ben açıkladı ilk cevap aldı! sağ el değişkenine uygulanır ve bu nedenle en yüksek değere sahiptir. Diğer çocuklar için özür dilerim;)
Gerald Schneider

4
@Gerald Schneider: Bunu telafi etmek için yapabileceğiniz en az şey, bu yanıtı en azından dilbilgisi ve biçimlendirme (biri çok ayrıntılı açıklaması için özellikle çağırdığınız) diğer cevaplarla eşit olacak şekilde geliştirmekti. !). Ama önemli değil, şimdi düzenledim.
BoltClock

PHP'de bile program yapmıyorum ve "==!" "==" ve "!" gibi iki operatör olarak okunur. Sadece bir düzenin bir şeyi nasıl okuduğunuzda ne kadar etkili olabileceğini gösterir.
StarNamer

2
@Bang Dao Um, JavaScript? === ve! == vardır. Ama hayır ==!
psr

2
@Bangdao Şimdi w3fools için başka bir neden buldunuz Lütfen okuyun, önemlidir.
bazı

77

==!PHP'de operatör yok

Onun sadece bir kombinasyonu ==ve !. Burada sadece ilgili operatör vardır ==. Böylece kombinasyon ==!normal bir şekilde çalışacak ==, kontrol edecek Equalityve bana güvenecek,

$variable_a ==! $variable_b 

dışında hiç kimse

$variable_a == (!$variable_b)

ve böylece;

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

Ve

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

Birden çok operatör karakterini birleştirmek her zaman operatör olarak çalışmayabilir. örneğin, alırsak =ve !, yalnızca !=veya örüntüsünde olması durumunda işleç olarak çalışır !==. Gibi bu karakterler için sayısız kombinasyonlar olabilir !====, !==!vs .. vs .. Operatör kombinasyonları olmalıdır eşsiz biçimi , eşsiz sırayla , eşsiz kombinasyonlar , kesinlikle (tüm karakterlerin tüm diğer karakterler ile birleştirmek olmaz) ve aralarında herhangi bir boşluk bırakmadan .

Aşağıdaki operatör listesini kontrol edin;

resim açıklamasını buraya girin


2
Kullanabilme yanılsaması altındaydım <table>.
Chad Harrison

+ neredeyse bir masa olduğunu düşündüm ... ama aslında bir görüntü
Baba

38

==! bir operatör değil iki:

== ve !

! daha yüksek önceliğe sahip ==

Yani :

"a" !== " ": bool(true) -> true çünkü "a" gerçekten "" ile eşit değil

"a" ==! " ": bool(false) -> false çünkü "a" eşit değildir! ""

== ve! Arasında boşluk bırakılarak yazılabilir.


1
false because "a" is not equals to !" "! "", bool ve inkâr etmek için oyuncu anlamına gelir, bu yüzden "" doğru ve! "" yanlıştır.
Zaffy

@quarry Evet Açıklamanın içine fazla girmedim: p
Michael Laffargue

29

==!böyle mevcut değil. Biraz şifreli bir gösterimi== !

Bu işlemlerde boşluklar önemli olmadığından, kolayca a --> bdeğerlendirebilir a-- > b, değerlendirir , ancak garip görünecektir.

Yani, soruya "a" ==! " "gelince : ayrıştırılacak "a" == !" ". Bir dize Olumsuzlaştırma kaplıdır döküm , herhangi bir dize anlam ancak "0"ve " "döküm zaman olduğu true.

Böylece, ifade "a" == !" "aktarılır:

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

Ve string "a"aynı şekilde değil bool true, bu tüm ifadeyi değerlendirir false.

Öyleyse, hikayenin ahlaki değeri nedir? Eksik ya da yanlış yerleştirilmiş alanlarla kafanızın karışmasına izin vermeyin! :)


3
bu yanıtta belirtilenden farklı olarak, "a" == true doğru olarak değerlendirilir, çünkü boş olmayan bir dize true boolean değerine verilir. "A" === true ifadesi false olarak değerlendirilir.
Pascal Rosin

25

==! operatör değil

==!bir php karşılaştırma operatörü değil - aynı == !(alanı not edin) ile aynı

yani

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.