Ho letto questo code, e hanno questa linea!! c operatore, è un due NOT?
switch (!!up + !!left) {
qual è !!
operatore? due NOT logici?
Ho letto questo code, e hanno questa linea!! c operatore, è un due NOT?
switch (!!up + !!left) {
qual è !!
operatore? due NOT logici?
sì, sono due numeri.
!!a
è 1
se a
è diverso da zero e se 0
a
è 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.
da non confondere con un doppio nodo, da cui è difficile uscire. – FlavorScape
Non è tanto "serrato" quanto "normalizzante". – kittemon
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. –
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.
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
!!
è un più portabile alternativa (-C99 pre) per (_Bool)
.
Sì. Sembra che chiunque abbia scritto non sapesse cosa stavano facendo. – AndyG
Hai pensato, sai, provalo e scoprilo? –
@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