2012-04-24 11 views
19

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?

+0

Sí. Parece que quien escribió no sabía muy bien lo que estaban haciendo. – AndyG

+4

¿Pensaste en, ya sabes, probarlo y descubrirlo? –

+0

@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

Respuesta

30

sí, son dos nots.

!!a es 1 si a no es cero y si 0a 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.

+12

que no debe confundirse con un nudo doble, de lo cual es difícil salir – FlavorScape

+4

No es tanto "fijación" como "normalización". – kittemon

+6

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. –

3

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.

5

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 
4

!! es una más-portátil alternativo (-C99 pre) a (_Bool).