Quelle est la raison de la double négation – (- n)?

Je passe par un code hérité et j’ai vu quelque chose comme

char n = 65; char str[1024]; sprintf(str, "%d", -(-n)); 

Pourquoi l’auteur (qui n’est plus présent) a-t-il écrit -(-n) plutôt que simplement n ? Ne suffirait-il pas?

La première chose à noter est que --n diminue en fait n de 1 et s’évalue à la nouvelle valeur, avec le type char ; donc, il fait quelque chose de très différent de -(-n) . Ne changez pas le code pour ça!

-n effectue une négation unaire de n et est également une expression de type int raison des règles de promotion de type de C. La négation suivante la rétablit à la valeur d’origine mais le type int conservé.

Donc -(-n) est en fait une manière verbeuse d’écrire +n , ce qui est souvent considéré comme un non-op, mais dans ce cas, il convertit le type de n en un int .

Je soupçonne que l’auteur se garde du refactoring errant et s’inquiétait de la non-concordance du type de l’argument avec le spécificateur de format %d .

Mais dans ce cas particulier , cela n’a pas d’importance: sprintf va automatiquement promouvoir le type de caractère en tant int , il est donc parfaitement sûr d’écrire

sprintf(str, "%d", n);

Pensez également à réduire la taille de la mémoire tampon str s’il s’agit d’un code “réel”, et envisagez d’utiliser la variante plus sûre de snprintf .

(En guise de remarque finale, notez qu’une double négation peut générer un dépassement de type intégral signé, utilisez-la avec prudence.)