2012-04-24 13 views
19

Ho letto questo code, e hanno questa linea!! c operatore, è un due NOT?

switch (!!up + !!left) { 

qual è !! operatore? due NOT logici?

+0

Sì. Sembra che chiunque abbia scritto non sapesse cosa stavano facendo. – AndyG

+4

Hai pensato, sai, provalo e scoprilo? –

+0

@Saucemaster, in realtà è un idioma per la mappatura zero/non zero su 0/1. Potrebbe anche essere considerato eccessivamente intelligente in questo particolare caso d'uso (vedi "ottimizzazione prematura"). – geekosaur

risposta

30

sì, sono due numeri.

!!a è 1 se a è diverso da zero e se 0a è 0

Si può pensare di !! come bloccaggio, per così dire, a {0,1}. Personalmente ritengo che l'uso sia un cattivo tentativo di apparire fantasioso.

+12

da non confondere con un doppio nodo, da cui è difficile uscire. – FlavorScape

+4

Non è tanto "serrato" quanto "normalizzante". – kittemon

+6

Se non ti piace, cosa preferiresti? '(_Bool)' (o '(bool)' se è stato incluso 'stdbool.h') funziona su C99 ma sembra gratuitamente dipendente da C99, e trovo che molte meno persone capiscono come funziona cast-to-bool che capire l'idioma '!!'. L'altra alternativa, "expr? 1: 0", è semplicemente brutta e gratuita. –

3

Hai ragione. Sono due numeri. Per capire perché si potrebbe fare questo, provare questo codice:

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

Produce The boolean value is 1, where 1 means true and 0 means false. Se si lascia cadere la !!, però, emette The boolean value is 7, where 1 means true and 0 means false.

5

Si può immaginare in questo modo:

!(!(a)) 

Se lo fai passo dopo passo, questo ha senso

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

Ciò restituirà 1 con qualsiasi numero (-42, 4.2f, ecc), ma solo con 0, questo accade

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

!! è un più portabile alternativa (-C99 pre) per (_Bool).