195 votes

Qu'est-ce que &&& opération en C

 #include <stdio.h>
int main(void)
{
        int i, c;
        for (i = 0; i < 3; i++) {
                c = i &&& i;
                printf("%d\n", c);
        }
        return 0;
}
 

La sortie du programme ci-dessus compilé en utilisant gcc est

 0
1
1
 

Avec l'option -Wall ou -Waddress , gcc émet un avertissement:

 warning: the address of ‘i' will always evaluate as ‘true' [-Waddress]
 

Comment c est-il évalué dans le programme ci-dessus?

272voto

Luchian Grigore Points 136646

C'est c = i && (&i); , la seconde partie étant redondante, puisque &i n'évaluera jamais à false .

Pour un type défini par l'utilisateur, où vous pouvez réellement surcharger unaire operator & , cela peut être différent, mais c'est toujours une très mauvaise idée .

Si vous activez les avertissements , vous obtiendrez quelque chose comme:

avertissement: l'adresse de 'i' sera toujours évaluée comme 'vrai'

118voto

Keith Thompson Points 85120

Il n'y a pas d' &&& opérateur ou un jeton dans C. Mais l' && ("et" logique) et & (unaire adresse du ou bit à bit "et") opérateurs existent.

Par la maximale munch à la règle, à ceci:

c = i &&& i;

est équivalent à ceci:

c = i && & i;

Il définit c à 1 si les deux i et &i sont vraies, et à 0 si l'une d'elles est fausse.

Pour un int, toute valeur non nulle est vraie. Pour un pointeur, toute valeur non nulle est vraie (et l'adresse d'un objet est toujours non nulle). Donc:

Il définit c 1 si i est non-nul, ou d' 0 si i est égal à zéro.

Ce qui implique que l' &&& est utilisé ici juste pour la délibérée de dissimulation. La cession pourrait tout aussi bien être l'un des suivants:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X