Comment utiliser “zd” spécificateur avec " printf()`?
À la recherche pour obtenir des éclaircissements sur l'utilisation de "zd"
avec printf()
.
Certainement la suivante est correcte avec le C99 et plus tard.
void print_size(size_t sz) {
printf("%zu\n", sz);
}
Le C spec semble permettre printf("%zd\n", sz)
en fonction de sa façon de lire:
7.21.6.1 La fprintf
fonction
z
Spécifie que l'un des suivantsd
,i
,o
,u
,x
, ouX
indicateur de conversion s'applique à unsize_t
ou le correspondant entier signé argument de type; ou qu'unn
indicateur de conversion s'applique à un pointeur vers un entier signé de type correspondant àsize_t
argument. C11dr §7.21.6.1 7
Cela devrait-il être lu comme
- "
z
Spécifie qu'und
... spécificateur de conversion s'applique à unsize_t
ou le correspondant entier signé argument de type ... "(deux types) et "z
Spécifie qu'unu
... spécificateur de conversion s'applique à unsize_t
ou le correspondant entier signé argument de type ..." (deux types)
OU
- "
z
Spécifie qu'und
... spécificateur de conversion s'applique à un correspondant entier signé argument de type ..." (signé) et "z
Spécifie qu'unu
... spécificateur de conversion s'applique à unsize_t
" (non signé).
J'ai été en utilisant le #2 de la définition, mais maintenant, pas si sûr.
Ce qui est correct, 1, 2, ou quelque chose d'autre?
Si #2 est correcte, ce qui est un exemple d'un type qui peut utiliser
"%zd"
?
OriginalL'auteur chux | 2015-10-02
Vous devez vous connecter pour publier un commentaire.
printf
avec un"%zd"
format attend un argument de type signé qui correspond au type non signésize_t
.Standard C n'est pas de donner un nom à ce type ou une bonne façon de déterminer ce qu'il est. Si
size_t
est un typedef pourunsigned long
, par exemple, alors"%zd"
attend un argument de typelong
, mais ce n'est pas un portable hypothèse.La norme exige que les entiers signés et non signés utiliser le même pour la représentation des valeurs non négatives qui sont représentables dans les deux types. Une note précise qu'il s'agit de suggérer qu'ils sont interchangeables, comme les arguments de la fonction. Donc:
devrait fonctionner, et doit s'imprimer "42". Il va interpréter la valeur
42
, du type non signésize_t
, comme s'il était le correspondant de type signé. Mais il n'y a vraiment aucune bonne raison de le faire, depuis"%zu"
est également correct et bien définie, sans avoir recours à de nouvelles règles de la langue. Et"%zu"
fonctionne pour tous les valeurs de typesize_t
, y compris ceux en dehors de la plage correspondant au type signé.Enfin, POSIX définit un type
ssize_t
dans les en-têtes<unistd.h>
et<sys/types.h>
. Si POSIX n'est pas explicitement de le dire, sans doutessize_t
sera le type signé correspondant àsize_t
.Donc, si vous écrivez POSIX-code spécifique,
"%zd"
est (probablement) le format correct pour l'impression des valeurs de typessize_t
.ouais j'ai eu. Il ne serait pas me permettre de remplacer downvote avec vote parce que c'est sbeen 2 heures. Ce qui est complètement débile parce que je peux les éditer et les modifier. J'ai demandé sur meta pour supprimer la limitation des gens qui ont assez de rep à modifier, mais il n'est pas allé n'importe où. Le changement a été la suppression supplémentaire de ligne vide avant le lien notes de bas de page qui ne sont pas affichés, vous ne pouvez pas le voir (j'ai honnêtement essayé de venir avec un engagement significatif de la modifier, mais la réponse était trop bon 🙂
OK, pas de problème. Il me semblait étrange que je ne pouvais pas voir de changement dans l'historique d'édition.
Je vois la diff: imgur.com/a/QEoAS
6.2.6.2p5: "Un valide (non-trap) objet de la représentation d'un entier signé de type où le bit de signe est égal à zéro est un objet valide de la représentation de la correspondante de type non signé, et doit représenter la même valeur." Je viens de remarquer que ne précise pas l'autre direction, même si elle aurait besoin d'un particulier de la représentation avec plusieurs représentations pour la même valeur non nulle pour briser la symétrie.
OriginalL'auteur Keith Thompson
Selon le peu de test que j'ai fait, "zd" est toujours vrai ,mais "zu" ne travaillez pas pour les nombres négatifs.
Code De Test:
vrai est prévue (correct) réponse)
Merci pour le test, mais certains '"zd" est toujours vrai " échouent lorsque
uzs
est grand commeSIZE_MAX
.Le test est pas la bonne façon de déterminer si les choses sont légales C.
Notez que quand on donne une valeur négative, %u sera toujours le rapport de quelque chose d'autre (dans une bien défini)
OriginalL'auteur