que la lectura de este code, y tienen esta línea!! c operador, ¿dos NO?
switch (!!up + !!left) {
lo que es !!
operador? dos NO lógicos?
que la lectura de este code, y tienen esta línea!! c operador, ¿dos NO?
switch (!!up + !!left) {
lo que es !!
operador? dos NO lógicos?
sí, son dos nots.
!!a
es 1
si a
no es cero y si 0
a
es 0
Se puede pensar en como !!
de sujeción, por así decirlo, a {0,1}
. Personalmente, considero que el uso es un mal intento de parecer elegante.
que no debe confundirse con un nudo doble, de lo cual es difícil salir – FlavorScape
No es tanto "fijación" como "normalización". – kittemon
Si no te gusta, ¿qué prefieres? '(_Bool)' (o '(bool)' si 'stdbool.h' ha sido incluido) funciona en C99 pero parece ser dependiente de C99, y me parece que mucha menos gente entiende cómo funciona el cast-to-bool que entender el modismo '!!' La otra alternativa, 'expr? 1: 0', es fea y gratuita. –
Tienes razón. Son dos nots. Para ver por qué se podría hacer esto, probar este código:
#include <stdio.h>
int foo(const int a)
{
return !!a;
}
int main()
{
const int b = foo(7);
printf(
"The boolean value is %d, "
"where 1 means true and 0 means false.\n",
b
);
return 0;
}
Genera The boolean value is 1, where 1 means true and 0 means false.
Si se le cae el !!
, sin embargo, se da salida a The boolean value is 7, where 1 means true and 0 means false.
Se puede imaginar así:
!(!(a))
Si lo hace paso a paso, esto tiene sentido
result = !42; //Result = 0
result = !(!42) //Result = 1 because !0 = 1
Esto devolverá 1
con cualquier número (-42, 4.2f, etc.) pero sólo con 0
, esto sucede
result = !0; //Result = 1
result = !(!0) //result = 0
!!
es una más-portátil alternativo (-C99 pre) a (_Bool)
.
Sí. Parece que quien escribió no sabía muy bien lo que estaban haciendo. – AndyG
¿Pensaste en, ya sabes, probarlo y descubrirlo? –
@Saucemaster, en realidad es un modismo para mapear cero/distinto de cero a 0/1. También podría calificarse como excesivamente inteligente en este caso de uso particular (ver "optimización prematura"). – geekosaur