@Binod que é uma informação interessante, obrigado por isso!
Robin K
Respostas:
290
Não é o "operador não duplo", é o operador não aplicado duas vezes. O direito !resultará em um booleano, independentemente do operando . Então a esquerda !negará esse valor booleano.
Isso significa que, para qualquer valor verdadeiro (números diferentes de zero, cadeias e matrizes não vazias, etc.), você obterá o valor booleano TRUEe, para qualquer valor falso (0, 0,0, NULLcadeias vazias ou matrizes vazias), receberá o valor booleano FALSE.
É funcionalmente equivalente a um elenco para boolean:
"não operador duplo" ou "operador não duplo" .. depende de como você o lê.
nickf
9
@nickf na verdade, "o operador duplo não" refere-se a um operador, não ao ato de usar o operador não duas vezes.
Theo
3
@ Theo, na verdade é um operador? O intérprete considera !!igual (bool)neste caso? Ou código de máquina diferente será executado dependendo de qual deles for usado?
Você pode usar quantas quiser. Se houver um número ímpar de 'estrondos' (pontos de exclamação), será uma operação NÃO igual a !value, e se houver um número par de estrondos, será o mesmo que (bool) value.
diamondsea
51
É o mesmo (ou quase o mesmo - pode haver algum caso de canto) como transmitir para bool. Se $rowconverter para verdadeiro, então!! $row também é verdade.
Mas se você deseja alcançar (bool) $row, provavelmente deve usar exatamente isso - e não algumas expressões "interessantes";)
Agradeço que, na verdade, faz sentido, nunca vi algo assim em outra linguagem de programação.
Andrei
16
Usar !!é um hábito restante da programação em C (++). Em C, fazer uma conversão não é tão fácil quanto no PHP, você pode obter muitos problemas diferentes, compilar avisos, assim também !!.
NikiC 20/09/10
1
@nikic - Parece estranho, IMO ... já que operator!é sobrecarregável, usá-lo C++seria perigoso. Além disso, você não pode converter estruturas em C ou usá !-las. Além disso, se algo puder ser negado, você provavelmente poderá retorná-lo de uma função retornando int, o que o torna um valor booleano. Tem certeza de que está falando sobre C?
Viraptor 20/09/10
2
Eu tenho visto !! em muitos programas C como uma conversão segura para 1/0. (Como booleano realmente não passa de 0 / "diferente de zero" em C.)
Prof. Falken
1
@viraptor, !!não é nada "interessante" como você afirmou. Está em todo lugar, de C a JavaScript.
Pacerier 30/03
18
Isso significa que, se $rowtiver um valor verdadeiro , ele retornará true, caso contráriofalse , convertendo para um valor booleano.
Aqui estão exemplos de expressões para conversão booleana de php docs.
"not not" é uma maneira conveniente em muitas línguas para entender qual valor de verdade a linguagem atribui ao resultado de qualquer expressão. Por exemplo, em Python :
>>>notnot[]False>>>notnot[False]True
Pode ser conveniente em locais onde você deseja reduzir um valor complexo para algo como "existe algum valor?".
Outra maneira mais humana, talvez mais simples, de 'ler' o não:
O primeiro '!' faz 2 coisas: 'converte' o valor em booleano e depois gera o seu oposto. Portanto, será verdadeiro se o valor for "falso".
O segundo '!' é apenas para produzir o oposto do primeiro.
Então, basicamente, o valor de entrada pode ser qualquer coisa, talvez uma string, mas você deseja uma saída booleana, então use o primeiro '!'. Nesse ponto, se você quiser VERDADEIRO quando o valor de entrada for 'falso', pare aqui e use apenas um '!'; caso contrário, se você quiser VERDADEIRO quando o valor de entrada for 'verdade', adicione outro '!'.
return (bool) $row;
Respostas:
Não é o "operador não duplo", é o operador não aplicado duas vezes. O direito
!
resultará em um booleano, independentemente do operando . Então a esquerda!
negará esse valor booleano.Isso significa que, para qualquer valor verdadeiro (números diferentes de zero, cadeias e matrizes não vazias, etc.), você obterá o valor booleano
TRUE
e, para qualquer valor falso (0, 0,0,NULL
cadeias vazias ou matrizes vazias), receberá o valor booleanoFALSE
.É funcionalmente equivalente a um elenco para
boolean
:fonte
!!
igual(bool)
neste caso? Ou código de máquina diferente será executado dependendo de qual deles for usado?!value
, e se houver um número par de estrondos, será o mesmo que(bool) value
.É o mesmo (ou quase o mesmo - pode haver algum caso de canto) como transmitir para bool. Se
$row
converter para verdadeiro, então!! $row
também é verdade.Mas se você deseja alcançar
(bool) $row
, provavelmente deve usar exatamente isso - e não algumas expressões "interessantes";)fonte
!!
é um hábito restante da programação em C (++). Em C, fazer uma conversão não é tão fácil quanto no PHP, você pode obter muitos problemas diferentes, compilar avisos, assim também!!
.operator!
é sobrecarregável, usá-loC++
seria perigoso. Além disso, você não pode converter estruturas em C ou usá!
-las. Além disso, se algo puder ser negado, você provavelmente poderá retorná-lo de uma função retornando int, o que o torna um valor booleano. Tem certeza de que está falando sobre C?!!
não é nada "interessante" como você afirmou. Está em todo lugar, de C a JavaScript.Isso significa que, se
$row
tiver um valor verdadeiro , ele retornarátrue
, caso contráriofalse
, convertendo para um valor booleano.Aqui estão exemplos de expressões para conversão booleana de php docs.
fonte
"not not" é uma maneira conveniente em muitas línguas para entender qual valor de verdade a linguagem atribui ao resultado de qualquer expressão. Por exemplo, em Python :
Pode ser conveniente em locais onde você deseja reduzir um valor complexo para algo como "existe algum valor?".
fonte
Outra maneira mais humana, talvez mais simples, de 'ler' o não:
O primeiro '!' faz 2 coisas: 'converte' o valor em booleano e depois gera o seu oposto. Portanto, será verdadeiro se o valor for "falso".
O segundo '!' é apenas para produzir o oposto do primeiro.
Então, basicamente, o valor de entrada pode ser qualquer coisa, talvez uma string, mas você deseja uma saída booleana, então use o primeiro '!'. Nesse ponto, se você quiser VERDADEIRO quando o valor de entrada for 'falso', pare aqui e use apenas um '!'; caso contrário, se você quiser VERDADEIRO quando o valor de entrada for 'verdade', adicione outro '!'.
fonte
Vamos olhar para
Em vez de interpretar o! operador como tendo o
Booleano oposto ao valor à sua direita
ler
pegue o oposto booleano da expressão à direita
Nesse caso
poderia ser uma expressão
assim é
assim é
e
e assim por diante, como cada uma delas é uma expressão válida, o! operador pode ser anexado a cada um deles.
fonte