Quand utiliser la double logique pas (!!) en C?

Quelles sont les utilisations valables pour annuler deux fois en C? Par exemple, quelque chose comme:

if (!!my_cond) { } 

Si je comprends bien, le !! garantira que le !!my_cond sera 0 si my_cond est false et 1 sinon. Quand auriez-vous besoin de l’utiliser?

Dans le contexte que vous montrez, il est inutile, car la valeur elle-même serait évaluée à 0 ou 1 .

Cela peut être utile dans un contexte qui ne ferait pas une telle conversion “booléenne”, telle que l’arithmétique ou l’indexation

 size_t zerovalues[2] = { 0, 0, }; for (size_t i = 0; i < N; ++i) ++zerovalues[!!A[i]]; 

A la fin, vous aurez le nombre 0 de A dans zerovalues[0] et le nombre de ceux qui ne le sont pas zerovalues[1]

Il peut être utilisé pour transformer quelque chose en expression booléenne.

Si foo = !!foo il donne foo 1 s’il ne s’agit pas d’un zéro et le laisse à 0 s’il l’est déjà.

Votre question a déjà trouvé une réponse ici: Confondu par l’utilisation de l’opérateur double logique non (!!)

Le double négatif peut être utilisé pour convertir les expressions logiques en 0 ou 1 afin qu’elles puissent être comparées à d’autres expressions logiques.

 int x = 63; printf("Output: %d %d %d\n", x, !x, !!x); 

Sortie: 63 0 1

Cela permet des comparaisons booléennes logiques qui autrement échoueraient.

Ce n’est pas un bon cas d’utilisation, mais il n’est pas inconcevable que vous puissiez vous heurter à un interfaçage avec du code qui utilise cet anti-motif:

 if (x == TRUE) ... 

Plus généralement, si vous implémentez une API documentée comme spécifiant renvoyer 0 en cas d’échec et 1 en cas de succès, il s’agit peut-être du moyen le plus simple d’assainir la valeur de retour finale.

Je crois que cela est utilisé pour indiquer au compilateur de traiter la variable testée comme un type bool