To nie jest „double not operator”, to nie operator zastosowany dwukrotnie. Prawo !spowoduje wynik logiczny, niezależnie od operandu . Wtedy lewica !zaprzeczy, że to boolean.
Oznacza to, że dla każdej wartości prawdziwej (liczby inne niż zero, niepuste ciągi i tablice itp.) Otrzymasz wartość boolowską TRUE, a dla każdej wartości fałszywej (0, 0,0 NULL, puste ciągi lub puste tablice) otrzymasz wartość logiczna FALSE.
Jest funkcjonalnie równoważny obsadzie do boolean:
„podwójny brak operatora” lub „podwójny brak operatora” zależy od tego, jak to czytasz.
nickf
9
@nickf nie jest tak naprawdę, „operator podwójnego braku” odnosi się do jednego operatora, a nie do dwukrotnego użycia operatora not.
Theo
3
@ Theo, to właściwie jeden operator? Czy w tym przypadku tłumacz uważa za !!równe (bool)? Czy może będzie uruchamiany inny kod maszynowy w zależności od tego, który jest używany?
Możesz użyć tyle, ile chcesz. Jeśli występuje nieparzysta liczba „grzywek” (wykrzykników), będzie to operacja NIE taka sama jak !value, a jeśli jest parzysta liczba grzywek, będzie taka sama jak (bool) value.
diamondsea
51
Jest to to samo (lub prawie takie samo - może być trochę rogu) jak casting na bool. Jeśli $rowmiałoby to dotyczyć prawdy, !! $rowto również jest prawdą.
Ale jeśli chcesz to osiągnąć (bool) $row, prawdopodobnie powinieneś użyć właśnie tego - a nie niektórych „interesujących” wyrażeń;)
Dzięki, że tak naprawdę ma sens, nigdy nie widziałem czegoś takiego w innym języku programowania.
Andrei
16
Używanie !!jest nawykiem pozostałym po programowaniu w C (++). W C robienie obsady nie jest tak łatwe, jak w PHP, możesz mieć wiele różnych problemów, kompilować ostrzeżenia, tak więc ludzie rzucają się na boll za pomocą !!.
NikiC,
1
@nikic - Brzmi dziwnie, IMO ... ponieważ operator!jest przeciążalny, użycie go C++byłoby niebezpieczne. Nie możesz też rzucać struktur w C ani używać !ich razem. Również jeśli coś można zanegować, najprawdopodobniej jesteś w stanie zwrócić to z funkcji zwracającej int, co w zasadzie sprawia, że jest to wartość logiczna. Czy na pewno mówisz o C?
viraptor,
2
Widziałem !! w wielu programach C jako bezpieczna konwersja do 1/0. (Boolean naprawdę jest niczym innym jak 0 / „niezerową” w C.)
Prof. Falken
1
@viraptor, !!nie jest niczym „interesującym”, jak twierdziłeś. Wszędzie jest od C do JavaScript.
Pacerier
18
Oznacza to, że jeśli $rowma prawdziwą wartość, wróci true, w przeciwnym razie falseprzekształci się w wartość logiczną.
Oto przykładowe wyrażenia do konwersji boolean z dokumentów php.
„nie nie” jest wygodnym sposobem w wielu językach dla zrozumienia, jaką wartość prawdy przypisuje językowi wynik dowolnego wyrażenia. Na przykład w Pythonie :
>>>notnot[]False>>>notnot[False]True
Może to być wygodne w miejscach, w których chcesz zredukować złożoną wartość do czegoś takiego jak „czy w ogóle jest jakaś wartość?”.
Kolejny bardziej ludzki, może prostszy sposób „odczytania” nie:
Pierwszy '!' robi 2 rzeczy: „przekształca” wartość na wartość logiczną, a następnie wypisuje jej przeciwieństwo. To da prawdę, jeśli wartość będzie „fałszywa”.
Drugi '!' jest po prostu odwrotnością pierwszego.
Zasadniczo wartość wejściowa może być dowolna, może być łańcuchem, ale chcesz otrzymać wynik logiczny, więc użyj pierwszego „!”. W tym momencie, jeśli chcesz PRAWDA, gdy wartością wejściową jest „fałsz”, zatrzymaj się tutaj i po prostu użyj pojedynczego „!”; w przeciwnym razie, jeśli chcesz PRAWDA, gdy wartość wejściowa jest „prawda”, dodaj kolejne „!”.
return (bool) $row;
Odpowiedzi:
To nie jest „double not operator”, to nie operator zastosowany dwukrotnie. Prawo
!
spowoduje wynik logiczny, niezależnie od operandu . Wtedy lewica!
zaprzeczy, że to boolean.Oznacza to, że dla każdej wartości prawdziwej (liczby inne niż zero, niepuste ciągi i tablice itp.) Otrzymasz wartość boolowską
TRUE
, a dla każdej wartości fałszywej (0, 0,0NULL
, puste ciągi lub puste tablice) otrzymasz wartość logicznaFALSE
.Jest funkcjonalnie równoważny obsadzie do
boolean
:źródło
!!
równe(bool)
? Czy może będzie uruchamiany inny kod maszynowy w zależności od tego, który jest używany?!value
, a jeśli jest parzysta liczba grzywek, będzie taka sama jak(bool) value
.Jest to to samo (lub prawie takie samo - może być trochę rogu) jak casting na bool. Jeśli
$row
miałoby to dotyczyć prawdy,!! $row
to również jest prawdą.Ale jeśli chcesz to osiągnąć
(bool) $row
, prawdopodobnie powinieneś użyć właśnie tego - a nie niektórych „interesujących” wyrażeń;)źródło
!!
jest nawykiem pozostałym po programowaniu w C (++). W C robienie obsady nie jest tak łatwe, jak w PHP, możesz mieć wiele różnych problemów, kompilować ostrzeżenia, tak więc ludzie rzucają się na boll za pomocą!!
.operator!
jest przeciążalny, użycie goC++
byłoby niebezpieczne. Nie możesz też rzucać struktur w C ani używać!
ich razem. Również jeśli coś można zanegować, najprawdopodobniej jesteś w stanie zwrócić to z funkcji zwracającej int, co w zasadzie sprawia, że jest to wartość logiczna. Czy na pewno mówisz o C?!!
nie jest niczym „interesującym”, jak twierdziłeś. Wszędzie jest od C do JavaScript.Oznacza to, że jeśli
$row
ma prawdziwą wartość, wrócitrue
, w przeciwnym raziefalse
przekształci się w wartość logiczną.Oto przykładowe wyrażenia do konwersji boolean z dokumentów php.
źródło
„nie nie” jest wygodnym sposobem w wielu językach dla zrozumienia, jaką wartość prawdy przypisuje językowi wynik dowolnego wyrażenia. Na przykład w Pythonie :
Może to być wygodne w miejscach, w których chcesz zredukować złożoną wartość do czegoś takiego jak „czy w ogóle jest jakaś wartość?”.
źródło
Kolejny bardziej ludzki, może prostszy sposób „odczytania” nie:
Pierwszy '!' robi 2 rzeczy: „przekształca” wartość na wartość logiczną, a następnie wypisuje jej przeciwieństwo. To da prawdę, jeśli wartość będzie „fałszywa”.
Drugi '!' jest po prostu odwrotnością pierwszego.
Zasadniczo wartość wejściowa może być dowolna, może być łańcuchem, ale chcesz otrzymać wynik logiczny, więc użyj pierwszego „!”. W tym momencie, jeśli chcesz PRAWDA, gdy wartością wejściową jest „fałsz”, zatrzymaj się tutaj i po prostu użyj pojedynczego „!”; w przeciwnym razie, jeśli chcesz PRAWDA, gdy wartość wejściowa jest „prawda”, dodaj kolejne „!”.
źródło
Spójrzmy na
Zamiast interpretować! operator jako przyjmujący
Wartość logiczna przeciwna do wartości po prawej stronie
czytać
ustaw wartość logiczną przeciwną do wyrażenia po prawej stronie
W tym przypadku
może być wyrazem
tak jest
więc jest
i
i tak dalej, ponieważ każde z nich jest prawidłowym wyrażeniem! operator może być dołączony do każdego z nich.
źródło