J'ai rencontré l'extrait suivant :
pt->aa[!!(ts->flags & MASK)] = -val;
- Qu'est-ce que
!!
(double point d'exclamation/ points d'exclamation/ deux opérateurs NOT) signifie-t-il en c ? - Non.
(!!NULL) == NULL
?
J'ai rencontré l'extrait suivant :
pt->aa[!!(ts->flags & MASK)] = -val;
!!
(double point d'exclamation/ points d'exclamation/ deux opérateurs NOT) signifie-t-il en c ?(!!NULL) == NULL
?!
est la négation. Donc !!
est la négation de la négation. Ce qui est important, c'est le fait que le résultat sera un int
.
!!x
si x == 0
es !!0
c'est-à-dire !1
c'est-à-dire 0
.!!x
si x != 0
es !!(!0)
c'est-à-dire !!1
c'est-à-dire !0
c'est-à-dire 1
.!!
est utilisé couramment si vous voulez convertir toute valeur non nulle en 1 tout en étant certain que le 0 reste un 0.
Et en effet, !!NULL == NULL
puisque !!NULL == !!0
y !!0 == !1
et enfin !1 == 0
.
Par conséquent, dans le court morceau de code que vous avez cité, l'indice du tableau sera soit 0
si la valeur de l'expression entre parenthèses est NULL
y 1
autrement.
(!!NULL) == NULL
est vrai si NULL
es 0
. Si NULL
est, disons, ((void*)0)
vous risquez d'obtenir un avertissement de comparaison entre un pointeur et un nombre entier. L'intérêt d'utiliser !!
consiste à convertir les résultats des expressions "truey" et "falsy" en nombres entiers.
@MikeDeSimone, @pmg, merci, j'ai ajouté l'information sur la valeur de l'expression étant un int
.
Vous dites "abusé", mais c'est un idiome courant. Que suggérez-vous comme alternative concise ?
@PCLuddite J'ai bien dit " (ab)utilisé ", laissant entendre que l'accusation d'abus est un peu légère ". Je recommanderais probablement pt->aa[(ts->flags & MASK) != 0]
car je pense que c'est beaucoup plus clair et explicite.
En C99, vous pouvez le remplacer par
#include <stdbool.h>
pt->aa[(bool)(ts->flags & MASK)] = -val;
Bien sûr, si votre code doit être portable en C89, vous feriez mieux de faire le truc ! ! ou
pt->aa[(ts->flags & MASK)!=0] = -val;
ou
pt->aa[(ts->flags & MASK)?1:0] = -val;
Le code généré sera certainement identique.
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.
3 votes
En rapport : stackoverflow.com/questions/10307281/c-operator-is-a-two-not
1 votes
Exemple : Dans mon code " De décimal à binaire : Indépendant de la taille : Première méthode " J'ai utilisé
!!
pour convertir unint
en0
o1
bit3 votes
Veuillez également noter que ce code est mauvais. Problème 1 : utilisation d'un bool comme index de tableau. Problème 2 : la syntaxe bizarre ! !, qui ne fait qu'embrouiller le lecteur (comme on peut le voir dans cette question). Problème 3 : calcul de l'indice du tableau avec une expression complexe inutile, qui aurait dû être déplacée sur une ligne distincte. Toutes ces choses pointent vers la même chose : je soupçonne que nous avons un programmeur qui pense être terriblement intelligent, mais qui en réalité a beaucoup à apprendre sur la conception correcte d'un programme et la maintenance du code.
5 votes
En parlant de la duplicata possible nomination, gardez à l'esprit que le C et le C++ sont deux différents les langues. Par conséquent, je pense qu'il est raisonnable d'avoir deux questions indépendantes avec des réponses indépendantes. Même si la sémantique est similaire aujourd'hui, les normes futures peuvent changer cet état.
0 votes
Jan a raison, la réponse au duplicata lié n'est pas correcte pour C.
0 votes
@Jan, cette question est étiquetée comme étant c et la question connexe est étiquetée comme suit c . si les étiquettes sont incorrectes, elles doivent être mises à jour.
0 votes
@JackAidley, si la réponse acceptée n'est pas correcte, alors quelqu'un qui cherche une réponse devrait placer une prime sur la question existante, et non demander un duplicata.
0 votes
@zzzzBov : les deux réponses sont correctes. Ce ne sont pas des doublons. Le C et le C++ gèrent cela différemment, le doublon pointait vers une question C++ à laquelle on avait répondu correctement ; ceci est une question C à laquelle on a répondu correctement. Et, maintenant, je vois que la question n'est pas correctement marquée comme un doublon. Tout va bien dans le capot.
0 votes
@zzzzBov : En fait, je vois que ceci a été marqué comme un duplicata de plus d'un ; celui qu'il est est maintenant suggéré comme un doublon de, est une question c - réponse correcte également - il avait été marqué comme un doublon d'une question demandant la même chose pour C++. La confusion règne !
0 votes
Remarquez, la réponse de Jan est meilleure que celle de stackoverflow.com/questions/10307281/c-operator-is-a-two-not