!! c operador, ¿dos NO?

Estoy leyendo este código , y tengo esta línea

switch (!!up + !!left) { 

que es !! operador? dos NO lógicos?

sí, son dos nots.

!!a es 1 si a no es cero y 0 si a es 0

¡¡Puedes pensar !! como fijación, por así decirlo, a {0,1} . Personalmente, considero que el uso es un mal bash de parecer elegante.

Puedes imaginarlo así:

 !(!(a)) 

Si lo haces 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 solo con 0 , esto sucederá

 result = !0; //Result = 1 result = !(!0) //result = 0 

!! es una alternativa más portátil (antes de C99) a (_Bool) .

Tienes razón. Son dos nots. Para ver por qué uno haría esto, pruebe este código:

 #include  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; } 

Salidas The boolean value is 1, where 1 means true and 0 means false. Si sueltas el !! , sin embargo, emite The boolean value is 7, where 1 means true and 0 means false.