Ecrit par
candide le mardi 15 juillet 2008 dans le thème :
C
Ce post reprend Message-ID:
Marc Espie a écrit :
> In article ,
> candide wrote:
>> Je ne comprends pas ce que ça ajoute par rapport à
>>
>> printf("%u\n",strlen("toto"));
>>
>> puisque size_t est un type entier non signé.
>
> Et quelle taille ? printf est une fonction a nombre variable d'arguments,
> de prototype
> int printf(const char *, ...);
>
> il n'y a donc pas de verif de type passe le format. Si tu es sur une
plateforme
> ou size_t vaut unsigned long, ton printf ne marchera pas: il
recuperera juste
> un unsigned int comme parametre.
Bon j'ai cherché à me documenter sur la question, hélas rien de très
clair. Si je lis la FAQ de clc, il est effectivement explicitement dit
que je dois caster, je le saurai pour la prochaine fois.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%u\n",strlen("toto"));
est exécutée ? La valeur de strlen("toto") est convertie dans le type
int parce que printf est variadique, c'est cela ?
_Ensuite_, cette valeur est convertie en unsigned int à cause du
spécificateur %u, c'est ça ?
Maintenant que se passe-t-il, étape par étape, quand l'instruction
printf("%u\n",(unsigned)strlen("toto"));
est exécutée ?
L'expression strlen("toto") est évaluée puis sa valeur est convertie en
unsigned int. Mais ensuite, pourquoi l'argument (unsigned)strlen("toto")
n'est-il pas converti en int puisque c'est un argument d'une fonction
variadique ?
Et puis, je ne vois pas où il est dit dans la norme que les arguments
entiers sont convertis en int. Si j'ai repéré l'endroit adéquat, la
conversion s'appelle "default argument promotion". Pour moi la
promotion, c'est la promotion :
char, short, champs de bit -> int ou unsigned int.
Mais la conversion
size_t (le type le plus large) -> int
c'est plus de la promotion, c'est une dégradation.
Classé sous : int,
printf,
unsigned,
strlen,
toto