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.)