PHP'de çift değil (!!) operatörü


Yanıtlar:


291

"Çift operatör değil" değil, iki kez uygulanan operatör değil . Sağ !, işlenenden bağımsız olarak bir boole ile sonuçlanacaktır . Sonra sol !bu booleanı reddeder.

Bu, herhangi bir gerçek değer için (sıfır, boş olmayan dizeler ve diziler dışındaki sayılar) boolean değerini alacağınız TRUEve herhangi bir yanlış değer (0, 0.0 NULL, boş dizeler veya boş diziler) alacağınız anlamına gelir. boole değeri FALSE.

İşlevsel olarak oyuncu kadrosuna eşdeğerdir boolean:

return (bool)$row;

22
"çift operatör değil" veya "çift operatör değil" .. nasıl okuduğunuza bağlıdır.
nickf

9
@nickf gerçekten değil, "çift değil işleci", bir işleci değil, iki işleci kullanma eylemini değil.
Theo

3
@Theo, Aslında bir operatör mü? Tercüman bu durumda !!eşit (bool)midir? Veya hangisinin kullanıldığına bağlı olarak farklı makine kodu çalıştırılacak mı?
Pacerier

Bu JavaScript için de işe yarıyor , İşte Javascript için Falsy Değerleri listesi ve heres PHP için Falsy Değerleri
Jomar

1
İstediğiniz kadar kullanabilirsiniz. Tek bir sayıda 'patlama' (ünlem işareti) varsa, aynı DEĞİL bir işlem olacaktır !valueve çift sayıda patlama varsa, aynı olacaktır (bool) value.
diamondsea

51

Boole dökmekle aynı (veya neredeyse aynı - bazı köşe davaları olabilir). Eğer $rowdoğruysa, o !! $rowzaman da doğrudur.

Ancak, başarmak (bool) $rowistiyorsanız, muhtemelen bunu kullanmalısınız - bazı "ilginç" ifadeleri değil;)


2
Teşekkür ederim aslında mantıklı, ben diğer programlama dilinde böyle bir şey gördüm.
Andrei

16
Kullanma !!C (++) programlama kalan bir alışkanlıktır. C'de bir döküm yapmak PHP'de olduğu kadar kolay değil, birçok farklı sorun elde edebilir, uyarıları derleyebilir, aso Böylece insanlar kullanarak koza attılar !!.
NikiC

1
@nikic - Kulağa garip geliyor, IMO ... operator!yüklenebildiğinden, onu kullanmak C++tehlikeli olacaktır. Ayrıca C'deki yapıları kullanamaz veya !onlarla birlikte kullanamazsınız . Ayrıca bir şey reddedilebiliyorsa, büyük olasılıkla bunu bir boolean yapan int işlevinden döndürebilirsiniz. C hakkında konuştuğunuzdan emin misiniz?
viraptor

2
Ben gördüm !! birçok C programında 1/0'a güvenli dönüşüm olarak. (Boole gerçekten C'de 0 / "sıfır olmayan" dan başka bir şey değildir)
Prof. Falken

1
@viraptor, !!iddia ettiğiniz gibi "ilginç" bir şey değil. C'den JavaScript'e kadar her yerde.
Pacerier

18

Doğru $rowbir değere sahipse geri döner true, aksi takdirde falsebir boole değerine dönüştürülür.

İşte php belgelerinden boole dönüşümüne örnek ifadeler.

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE

7

"değil", birçok dilde, dilin herhangi bir ifadenin sonucuna hangi hakikat değerini verdiğini anlamak için uygun bir yoldur. Örneğin, Python'da :

>>> not not []
False
>>> not not [False]
True

Karmaşık bir değeri, "hiç bir değer var mı?" Gibi bir şeye indirgemek istediğiniz yerlerde kullanışlı olabilir.


1

Değil 'okumak' için daha insani, belki daha basit bir yol:

  • İlk '!' 2 şey yapar: değeri boole'ye dönüştürün, sonra tersini çıktılayın. Bu nedenle, değerin 'sahte' bir değer olması doğru olacaktır.

  • İkinci '!' sadece birincinin tersini çıkarmaktır.

Yani, temel olarak, giriş değeri herhangi bir şey olabilir, belki bir dize olabilir, ancak bir boole çıktısı istersiniz, bu yüzden ilk '!' Kullanın. Bu noktada, giriş değeri 'falsy' olduğunda TRUE istiyorsanız, burada durun ve tek bir '!' Kullanın; aksi takdirde, giriş değeri 'doğruluk' olduğunda DOĞRU istiyorsanız, başka bir '!' ekleyin.


0

Şuna bakalım

!$a;

Yorumlamak yerine! operatör olarak

Boolean zıt değeri onun sağında

okumak

ifadenin Boolean karşıtını sağına al

Bu durumda

$a;

bir ifade olabilir

öyle ki

!$a;

öyle de

!!$a;

ve

!!!$a;

ve böylece, bunların her biri geçerli bir ifade olduğundan,! operatör bunların her birine eklenebilir.

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.