Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
(Marc Espie) écrivait :
In article <487d095d$0$18576$,
candide wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille (sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
... pour une fois, c'est juste du bon sens. Si tu veux le texte
de la norme, c'est 6.5.2.2 (qui explique les default argument promotions en
termes d'integer promotions et de float -> double et specifient que celles-ci
s'appliquent pour l'ellipse), et 6.3.1.1 (qui expliquent les integer
promotions, qui grosso modo reviennent a convertir tout ce qui est
`plus petit'en int ou unsigned int, et a laisser intact tout ce qui est plus grand).
Mais il faut se méfier en passant d'une architecture où les int font 32
bits à une où ils font 16 bits. On peut avoir des surprises.
espie@lain.home (Marc Espie) écrivait :
In article <487d095d$0$18576$426a74cc@news.free.fr>,
candide <candide@free.invalid> wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille (sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
... pour une fois, c'est juste du bon sens. Si tu veux le texte
de la norme, c'est 6.5.2.2 (qui explique les default argument promotions en
termes d'integer promotions et de float -> double et specifient que celles-ci
s'appliquent pour l'ellipse), et 6.3.1.1 (qui expliquent les integer
promotions, qui grosso modo reviennent a convertir tout ce qui est
`plus petit'
en int ou unsigned int, et a laisser intact tout ce qui est plus grand).
Mais il faut se méfier en passant d'une architecture où les int font 32
bits à une où ils font 16 bits. On peut avoir des surprises.
(Marc Espie) écrivait :
In article <487d095d$0$18576$,
candide wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille (sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
... pour une fois, c'est juste du bon sens. Si tu veux le texte
de la norme, c'est 6.5.2.2 (qui explique les default argument promotions en
termes d'integer promotions et de float -> double et specifient que celles-ci
s'appliquent pour l'ellipse), et 6.3.1.1 (qui expliquent les integer
promotions, qui grosso modo reviennent a convertir tout ce qui est
`plus petit'en int ou unsigned int, et a laisser intact tout ce qui est plus grand).
Mais il faut se méfier en passant d'une architecture où les int font 32
bits à une où ils font 16 bits. On peut avoir des surprises.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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("%un",(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.
In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
In article <487d095d$0$18576$426a74cc@news.free.fr>,
candide <candide@free.invalid> wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
In article <487d095d$0$18576$426a74cc@news.free.fr>,
candide <candide@free.invalid> wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
En news:487d095d$0$18576$, candide va escriure:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
En news:487d095d$0$18576$426a74cc@news.free.fr, candide va escriure:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
En news:487d095d$0$18576$, candide va escriure:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
En news:487d095d$0$18576$, candide va escriure:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
En news:487d095d$0$18576$426a74cc@news.free.fr, candide va escriure:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
En news:487d095d$0$18576$, candide va escriure:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",strlen("toto"));
est exécutée ?
Il y a deux temps bien distincts.
Premier temps, la compilation.
Marc Espie a écrit :In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
Je ne trouve pas ton discours très précis.
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
Je suppose que c'est en cherchant le spécificateur %l, non ?
Mais alors à quoi servent les promotions des arguments par défaut
("default argument promotions") ?
d'exécution de printf : quand y-a-t-il conversion et en fonction de quoi
cette(ces) conversion(s) est(sont)-elle(s) faite(s) ?
Quand j'ai
printf("%un",strlen("toto"));
strlen("toto") est évalué puis en fonction du spécificateur %u, cette
valeur est convertie en unsigned int, c'est ça ? Si c'est ça, je vois ne
vois pas où ces fout*** "default argument promotions" interviennent. Et
ça correspondrait à ce que j'ai compris : les promotions promeuvent (et
ne dégradent pas donc).
Marc Espie a écrit :
In article <487d095d$0$18576$426a74cc@news.free.fr>,
candide <candide@free.invalid> wrote:
Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
Je ne trouve pas ton discours très précis.
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
Je suppose que c'est en cherchant le spécificateur %l, non ?
Mais alors à quoi servent les promotions des arguments par défaut
("default argument promotions") ?
d'exécution de printf : quand y-a-t-il conversion et en fonction de quoi
cette(ces) conversion(s) est(sont)-elle(s) faite(s) ?
Quand j'ai
printf("%un",strlen("toto"));
strlen("toto") est évalué puis en fonction du spécificateur %u, cette
valeur est convertie en unsigned int, c'est ça ? Si c'est ça, je vois ne
vois pas où ces fout*** "default argument promotions" interviennent. Et
ça correspondrait à ce que j'ai compris : les promotions promeuvent (et
ne dégradent pas donc).
Marc Espie a écrit :In article <487d095d$0$18576$,
candide wrote:Mais que se passe-t-il, étape par étape, quand l'instruction
printf("%un",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 ?
Non, elle est plus ou moins laissee telle quelle, en particulier en terme
de taille
Je ne trouve pas ton discours très précis.
(sinon, tu fais comment pour passer des long a des fonctions
variadiques, gros malin ?)
Je suppose que c'est en cherchant le spécificateur %l, non ?
Mais alors à quoi servent les promotions des arguments par défaut
("default argument promotions") ?
d'exécution de printf : quand y-a-t-il conversion et en fonction de quoi
cette(ces) conversion(s) est(sont)-elle(s) faite(s) ?
Quand j'ai
printf("%un",strlen("toto"));
strlen("toto") est évalué puis en fonction du spécificateur %u, cette
valeur est convertie en unsigned int, c'est ça ? Si c'est ça, je vois ne
vois pas où ces fout*** "default argument promotions" interviennent. Et
ça correspondrait à ce que j'ai compris : les promotions promeuvent (et
ne dégradent pas donc).
Enfin, le compilateur attribue le type size_t au résultat, et on peut passer
à la suite.
(...) pour l'expression, on applique les règles de promotions:
ainsi si le type (entier) size_t est « de rang inférieur » à int, on a
conversion (vers int ou unsigned, c'est selon); si size_t est de rang
supérieur (le même que unsigned long, par exemple), il n'y a pas de
conversion; (...)
Le compilateur passe ensuite à la génération du code d'appel d'une fonction
variadique
(...) et le résultat de l'expression est passé conformément à son type
après promotion: par exemple, si c'est un unsigned long de taille double de
celle d'un int, il va utiliser deux fois plus de place...
Enfin, le compilateur attribue le type int au résultat, et on peut passer à
la suite.
(...) Puis va faire l'appel à
printf, avec comme paramètre un pointeur vers {'%', 'u', NL, 0} et d'autre
part le 4 (converti): (...)
l'appel de fonction variadique, va analyser la chaîne, repérer le %u, aller
chercher dans les paramètres passés une valeur de type unsigned
Maintenant que se passe-t-il, étape par étape, quand l'instruction
printf("%un",(unsigned)strlen("toto"));
est exécutée ?
Par rapport à ci-dessus, après l'appel à strlen, le résultat subit une
conversion forcée vers unsigned int (ce qui peut provoquer un appel de
fonction ou pas, l'émission de code ou pas, etc.)
Ensuite, au moment de l'évaluation des paramètres dans l'opération d'appel
de fonction variadique, le cas est plus déterministe, il n'y a pas de
promotion.
promotion. Et plus bas, le paramètre est passé comme unsigned.
Dans le deuxième temps, au moment d'interpréter la conversion %u, print ira
chercher un unsigned, et donc trouvera toujours 4.
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 ?
Parce qu'il n'y a pas que des int dans la vie.
Bin non. Si size_t est un alias pour unsigned char, c'est bien une
promotion.
Enfin, le compilateur attribue le type size_t au résultat, et on peut passer
à la suite.
(...) pour l'expression, on applique les règles de promotions:
ainsi si le type (entier) size_t est « de rang inférieur » à int, on a
conversion (vers int ou unsigned, c'est selon); si size_t est de rang
supérieur (le même que unsigned long, par exemple), il n'y a pas de
conversion; (...)
Le compilateur passe ensuite à la génération du code d'appel d'une fonction
variadique
(...) et le résultat de l'expression est passé conformément à son type
après promotion: par exemple, si c'est un unsigned long de taille double de
celle d'un int, il va utiliser deux fois plus de place...
Enfin, le compilateur attribue le type int au résultat, et on peut passer à
la suite.
(...) Puis va faire l'appel à
printf, avec comme paramètre un pointeur vers {'%', 'u', NL, 0} et d'autre
part le 4 (converti): (...)
l'appel de fonction variadique, va analyser la chaîne, repérer le %u, aller
chercher dans les paramètres passés une valeur de type unsigned
Maintenant que se passe-t-il, étape par étape, quand l'instruction
printf("%un",(unsigned)strlen("toto"));
est exécutée ?
Par rapport à ci-dessus, après l'appel à strlen, le résultat subit une
conversion forcée vers unsigned int (ce qui peut provoquer un appel de
fonction ou pas, l'émission de code ou pas, etc.)
Ensuite, au moment de l'évaluation des paramètres dans l'opération d'appel
de fonction variadique, le cas est plus déterministe, il n'y a pas de
promotion.
promotion. Et plus bas, le paramètre est passé comme unsigned.
Dans le deuxième temps, au moment d'interpréter la conversion %u, print ira
chercher un unsigned, et donc trouvera toujours 4.
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 ?
Parce qu'il n'y a pas que des int dans la vie.
Bin non. Si size_t est un alias pour unsigned char, c'est bien une
promotion.
Enfin, le compilateur attribue le type size_t au résultat, et on peut passer
à la suite.
(...) pour l'expression, on applique les règles de promotions:
ainsi si le type (entier) size_t est « de rang inférieur » à int, on a
conversion (vers int ou unsigned, c'est selon); si size_t est de rang
supérieur (le même que unsigned long, par exemple), il n'y a pas de
conversion; (...)
Le compilateur passe ensuite à la génération du code d'appel d'une fonction
variadique
(...) et le résultat de l'expression est passé conformément à son type
après promotion: par exemple, si c'est un unsigned long de taille double de
celle d'un int, il va utiliser deux fois plus de place...
Enfin, le compilateur attribue le type int au résultat, et on peut passer à
la suite.
(...) Puis va faire l'appel à
printf, avec comme paramètre un pointeur vers {'%', 'u', NL, 0} et d'autre
part le 4 (converti): (...)
l'appel de fonction variadique, va analyser la chaîne, repérer le %u, aller
chercher dans les paramètres passés une valeur de type unsigned
Maintenant que se passe-t-il, étape par étape, quand l'instruction
printf("%un",(unsigned)strlen("toto"));
est exécutée ?
Par rapport à ci-dessus, après l'appel à strlen, le résultat subit une
conversion forcée vers unsigned int (ce qui peut provoquer un appel de
fonction ou pas, l'émission de code ou pas, etc.)
Ensuite, au moment de l'évaluation des paramètres dans l'opération d'appel
de fonction variadique, le cas est plus déterministe, il n'y a pas de
promotion.
promotion. Et plus bas, le paramètre est passé comme unsigned.
Dans le deuxième temps, au moment d'interpréter la conversion %u, print ira
chercher un unsigned, et donc trouvera toujours 4.
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 ?
Parce qu'il n'y a pas que des int dans la vie.
Bin non. Si size_t est un alias pour unsigned char, c'est bien une
promotion.