Je crois que beaucoup de livres de C n'ont pas tenu compte de cette note
de pas de page. Par exemple, dans le livre de Delannoy, je lis (page
78, §3.1) :
------------------------8<-----------------------------
"Aucun opérateur n'accepte d'opérandes de type char ou short."
------------------------>8-----------------------------
C'est vrai ou pas ?
De même dans le livre de Braquelaire, je lis :
------------------------8<-----------------------------
"Lors de l'évaluation d'une expression, un opérande d'un type intégral
caractère, entier court, champ de bits ou énumération est converti dans
le type int ou dans le type unsigned int si le type int n'est pas assez
grand pour représenter toutes les valeurs de son type. Cette conversion
s'appelle promotion intégrale. "
------------------------>8-----------------------------
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette note
de pas de page. Par exemple, dans le livre de Delannoy, je lis (page
78, §3.1) :
------------------------8<-----------------------------
"Aucun opérateur n'accepte d'opérandes de type char ou short."
------------------------>8-----------------------------
C'est vrai ou pas ?
De même dans le livre de Braquelaire, je lis :
------------------------8<-----------------------------
"Lors de l'évaluation d'une expression, un opérande d'un type intégral
caractère, entier court, champ de bits ou énumération est converti dans
le type int ou dans le type unsigned int si le type int n'est pas assez
grand pour représenter toutes les valeurs de son type. Cette conversion
s'appelle promotion intégrale. "
------------------------>8-----------------------------
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette note
de pas de page. Par exemple, dans le livre de Delannoy, je lis (page
78, §3.1) :
------------------------8<-----------------------------
"Aucun opérateur n'accepte d'opérandes de type char ou short."
------------------------>8-----------------------------
C'est vrai ou pas ?
De même dans le livre de Braquelaire, je lis :
------------------------8<-----------------------------
"Lors de l'évaluation d'une expression, un opérande d'un type intégral
caractère, entier court, champ de bits ou énumération est converti dans
le type int ou dans le type unsigned int si le type int n'est pas assez
grand pour représenter toutes les valeurs de son type. Cette conversion
s'appelle promotion intégrale. "
------------------------>8-----------------------------
La norme explicite la possibilite d'avoir le calcul sur les float, et
La norme explicite la possibilite d'avoir le calcul sur les float, et
La norme explicite la possibilite d'avoir le calcul sur les float, et
D'abord, un point de vocabulaire : en français, parle-t-on de
"promotion entière" ou de "promotion intégrale" ?
D'autre part, le passage de la norme qui parle de cette question est,
à mon sens, trop fortement obscurci par une note de bas de page.
------------------------8<-----------------------------
6.3.1.1p2
(...)If an int can represent all values of the original type, the
value is converted to an int; otherwise, it is converted to an
unsigned int. These are called the integer promotions.(48)
La note de bas de page :
(48) -- The integer promotions are applied only: as part of the usual
arithmetic conversions, to certain argument expressions, to the
operands of the unary +, -, and ~ operators, and to both operands of
the shift operators, as specified by their respective subclauses.
------------------------>8-----------------------------
Si j'ai bien lu la norme, les conversions arithmétiques usuelles
s'appliquent uniquement à des opérateurs binaires
et il faut regarder dans la norme au cas par cas lesquels sont
concernés.
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
Par exemple, dans le livre de Delannoy, je lis :
"Aucun opérateur n'accepte d'opérandes de type char ou short."
C'est vrai ou pas ?
Plus généralement, avez-vous des exemples simples où la promotion
entière ne s'applique pas ?
D'abord, un point de vocabulaire : en français, parle-t-on de
"promotion entière" ou de "promotion intégrale" ?
D'autre part, le passage de la norme qui parle de cette question est,
à mon sens, trop fortement obscurci par une note de bas de page.
------------------------8<-----------------------------
6.3.1.1p2
(...)If an int can represent all values of the original type, the
value is converted to an int; otherwise, it is converted to an
unsigned int. These are called the integer promotions.(48)
La note de bas de page :
(48) -- The integer promotions are applied only: as part of the usual
arithmetic conversions, to certain argument expressions, to the
operands of the unary +, -, and ~ operators, and to both operands of
the shift operators, as specified by their respective subclauses.
------------------------>8-----------------------------
Si j'ai bien lu la norme, les conversions arithmétiques usuelles
s'appliquent uniquement à des opérateurs binaires
et il faut regarder dans la norme au cas par cas lesquels sont
concernés.
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
Par exemple, dans le livre de Delannoy, je lis :
"Aucun opérateur n'accepte d'opérandes de type char ou short."
C'est vrai ou pas ?
Plus généralement, avez-vous des exemples simples où la promotion
entière ne s'applique pas ?
D'abord, un point de vocabulaire : en français, parle-t-on de
"promotion entière" ou de "promotion intégrale" ?
D'autre part, le passage de la norme qui parle de cette question est,
à mon sens, trop fortement obscurci par une note de bas de page.
------------------------8<-----------------------------
6.3.1.1p2
(...)If an int can represent all values of the original type, the
value is converted to an int; otherwise, it is converted to an
unsigned int. These are called the integer promotions.(48)
La note de bas de page :
(48) -- The integer promotions are applied only: as part of the usual
arithmetic conversions, to certain argument expressions, to the
operands of the unary +, -, and ~ operators, and to both operands of
the shift operators, as specified by their respective subclauses.
------------------------>8-----------------------------
Si j'ai bien lu la norme, les conversions arithmétiques usuelles
s'appliquent uniquement à des opérateurs binaires
et il faut regarder dans la norme au cas par cas lesquels sont
concernés.
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
Par exemple, dans le livre de Delannoy, je lis :
"Aucun opérateur n'accepte d'opérandes de type char ou short."
C'est vrai ou pas ?
Plus généralement, avez-vous des exemples simples où la promotion
entière ne s'applique pas ?
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risque
élevé de me planter :-B).Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
type
char.
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risque
élevé de me planter :-B).
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
type
char.
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risque
élevé de me planter :-B).Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
type
char.
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
;)Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risqueélevé de me planter :-B).Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Justement, une des choses les plus difficiles du C je trouve est (je
parle en tant que post-débutant) de comprendre tout ce qui tient aux
conversions et aux cast.
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
typechar.
Tiens oui, en effet. J'espère que la norme explique ça quelque part (je
dis ça parce que je ne vois pas ce point dans le paragraphe 6.5.3.4 The
sizeof operator).
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
;)
Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risque
élevé de me planter :-B).
Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Justement, une des choses les plus difficiles du C je trouve est (je
parle en tant que post-débutant) de comprendre tout ce qui tient aux
conversions et aux cast.
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
type
char.
Tiens oui, en effet. J'espère que la norme explique ça quelque part (je
dis ça parce que je ne vois pas ce point dans le paragraphe 6.5.3.4 The
sizeof operator).
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Si tu as un meilleur texte à proposer (en anglais) pour la note, tu peux
lancer une discussion sur comp.std.c ;
;)Concernant les "argument expressions", bon je suppose les expressions
qui sont arguments de fonctions, lesquelles sont concernées ?
Il y a deux pages de texte dans 6.5.2.2 qui sont quasiment exclusivement
dédiées à ce sujet, donc je ne vais pas faire un long exposé (avec le
risqueélevé de me planter :-B).Je crois que beaucoup de livres de C n'ont pas tenu compte de cette
note de pas de page.
En fait, beaucoup de livres de C cherchent à rendre accessible un
sujet ;
Justement, une des choses les plus difficiles du C je trouve est (je
parle en tant que post-débutant) de comprendre tout ce qui tient aux
conversions et aux cast.
Bin non. Par exemple, dans
char i; int j = sizeof i;
l'opérande (ici i) de l'opérateur sizeof n'est pas promu, et reste de
typechar.
Tiens oui, en effet. J'espère que la norme explique ça quelque part (je
dis ça parce que je ne vois pas ce point dans le paragraphe 6.5.3.4 The
sizeof operator).
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Quand on parle de promotion (dans tous les langages avec des conversions
implicites et pas seulement en C) d'une variable dans un autre type, il
ne s'agit pas de la conversion de la variable elle-même mais de la
création, par le compilateur, d'une variable temporaire qui contiendra
le résultat de la promotion (comme pour le passage d'arguments par valeur).
Attention aux confusions !!
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Quand on parle de promotion (dans tous les langages avec des conversions
implicites et pas seulement en C) d'une variable dans un autre type, il
ne s'agit pas de la conversion de la variable elle-même mais de la
création, par le compilateur, d'une variable temporaire qui contiendra
le résultat de la promotion (comme pour le passage d'arguments par valeur).
Attention aux confusions !!
Et bien heureusement que i reste de type char puisqu'il estde type... char.
Quand on parle de promotion (dans tous les langages avec des conversions
implicites et pas seulement en C) d'une variable dans un autre type, il
ne s'agit pas de la conversion de la variable elle-même mais de la
création, par le compilateur, d'une variable temporaire qui contiendra
le résultat de la promotion (comme pour le passage d'arguments par valeur).
Attention aux confusions !!
Wykaaa a écrit :
Et bien heureusement que i reste de type char puisqu'il estde type...
char.
Et qui a dit le contraire ? La question était de savoir où la norme
explique qu'il n'y a pas lieu de convertir ainsi par exemple qu'elle
l'explique pour un tableau opérande de l'opérateur sizeof.
Quand on parle de promotion (dans tous les langages avec des
conversions implicites et pas seulement en C) d'une variable dans un
autre type, il ne s'agit pas de la conversion de la variable elle-même
mais de la création, par le compilateur, d'une variable temporaire qui
contiendra le résultat de la promotion (comme pour le passage
d'arguments par valeur).
Attention aux confusions !!
Quelles confusions ? celles que tu as eu faites peut-être ? D'ailleurs,
tu spécules sur ce que dit la norme à ce sujet, elle ne parle pas de la
création de "variable temporaire", elle dit juste qu'il y a conversion
de la _valeur_ d'un opérande d'un type vers un autre. Comment ? ça on en
sait rien. Et même pour le passage par valeur, la norme ne parle pas de
"variable temporaire" ou de pile, elle dit seulement ce qui se passe
mais pas comment, puisqu'on lit seulement, dans une note de bas de page :
--------------------------------- 8< --------------------------
A function may change the values of its parameters, but these
changes cannot affect the values of the arguments.
--------------------------------- >8 --------------------------
Pour en revenir à ma question, à laquelle tu n'as pas répondu, la norme
en fait dit qu'il n'y a pas de conversion de l'opérande d'un sizeof
quand elle dit :
--------------------------------- 8< --------------------------
The size is determined from the type of the operand, which is not itself
evaluated.
--------------------------------- >8 --------------------------
S'il n'y a pas évaluation, il n'y a pas conversion.
Wykaaa a écrit :
Et bien heureusement que i reste de type char puisqu'il estde type...
char.
Et qui a dit le contraire ? La question était de savoir où la norme
explique qu'il n'y a pas lieu de convertir ainsi par exemple qu'elle
l'explique pour un tableau opérande de l'opérateur sizeof.
Quand on parle de promotion (dans tous les langages avec des
conversions implicites et pas seulement en C) d'une variable dans un
autre type, il ne s'agit pas de la conversion de la variable elle-même
mais de la création, par le compilateur, d'une variable temporaire qui
contiendra le résultat de la promotion (comme pour le passage
d'arguments par valeur).
Attention aux confusions !!
Quelles confusions ? celles que tu as eu faites peut-être ? D'ailleurs,
tu spécules sur ce que dit la norme à ce sujet, elle ne parle pas de la
création de "variable temporaire", elle dit juste qu'il y a conversion
de la _valeur_ d'un opérande d'un type vers un autre. Comment ? ça on en
sait rien. Et même pour le passage par valeur, la norme ne parle pas de
"variable temporaire" ou de pile, elle dit seulement ce qui se passe
mais pas comment, puisqu'on lit seulement, dans une note de bas de page :
--------------------------------- 8< --------------------------
A function may change the values of its parameters, but these
changes cannot affect the values of the arguments.
--------------------------------- >8 --------------------------
Pour en revenir à ma question, à laquelle tu n'as pas répondu, la norme
en fait dit qu'il n'y a pas de conversion de l'opérande d'un sizeof
quand elle dit :
--------------------------------- 8< --------------------------
The size is determined from the type of the operand, which is not itself
evaluated.
--------------------------------- >8 --------------------------
S'il n'y a pas évaluation, il n'y a pas conversion.
Wykaaa a écrit :
Et bien heureusement que i reste de type char puisqu'il estde type...
char.
Et qui a dit le contraire ? La question était de savoir où la norme
explique qu'il n'y a pas lieu de convertir ainsi par exemple qu'elle
l'explique pour un tableau opérande de l'opérateur sizeof.
Quand on parle de promotion (dans tous les langages avec des
conversions implicites et pas seulement en C) d'une variable dans un
autre type, il ne s'agit pas de la conversion de la variable elle-même
mais de la création, par le compilateur, d'une variable temporaire qui
contiendra le résultat de la promotion (comme pour le passage
d'arguments par valeur).
Attention aux confusions !!
Quelles confusions ? celles que tu as eu faites peut-être ? D'ailleurs,
tu spécules sur ce que dit la norme à ce sujet, elle ne parle pas de la
création de "variable temporaire", elle dit juste qu'il y a conversion
de la _valeur_ d'un opérande d'un type vers un autre. Comment ? ça on en
sait rien. Et même pour le passage par valeur, la norme ne parle pas de
"variable temporaire" ou de pile, elle dit seulement ce qui se passe
mais pas comment, puisqu'on lit seulement, dans une note de bas de page :
--------------------------------- 8< --------------------------
A function may change the values of its parameters, but these
changes cannot affect the values of the arguments.
--------------------------------- >8 --------------------------
Pour en revenir à ma question, à laquelle tu n'as pas répondu, la norme
en fait dit qu'il n'y a pas de conversion de l'opérande d'un sizeof
quand elle dit :
--------------------------------- 8< --------------------------
The size is determined from the type of the operand, which is not itself
evaluated.
--------------------------------- >8 --------------------------
S'il n'y a pas évaluation, il n'y a pas conversion.
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
In article <485becb1$0$913$,
Wykaaa wrote:Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
Trop peremptoire et faux. Sur pas mal de processeurs, une grosse
proportion des passages de parametres par valeur se font par registres.
Sur des compilateurs un peu plus futes que ceux que tu as ecrit, il peut
y avoir une analyse de flux suffisante pour se passer de toute copie
si elle n'est pas necessaire (par exemple, si un parametre est passe
a une fonction feuille, et que cette fonction ne modifie pas ce parametre,
le compilateur peut tres bien passer la variable elle-meme si elle est
deja dans le bon registre, voire s'arranger pour allouer la variable
dans le bon registre directement).
La norme est justement ecrite par des gens qui comprennent le fonctionnement
de ce genre de compilateurs, et qui laissent suffisamment de marge a
l'implementeur pour pouvoir mettre en place ce type d'optimisation.
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
Ca fait beaucoup d'hypotheses non necessairement verifiees dans certains
cas pratiques, tout ca.
In article <485becb1$0$913$ba4acef3@news.orange.fr>,
Wykaaa <wykaaa@yahoo.fr> wrote:
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
Trop peremptoire et faux. Sur pas mal de processeurs, une grosse
proportion des passages de parametres par valeur se font par registres.
Sur des compilateurs un peu plus futes que ceux que tu as ecrit, il peut
y avoir une analyse de flux suffisante pour se passer de toute copie
si elle n'est pas necessaire (par exemple, si un parametre est passe
a une fonction feuille, et que cette fonction ne modifie pas ce parametre,
le compilateur peut tres bien passer la variable elle-meme si elle est
deja dans le bon registre, voire s'arranger pour allouer la variable
dans le bon registre directement).
La norme est justement ecrite par des gens qui comprennent le fonctionnement
de ce genre de compilateurs, et qui laissent suffisamment de marge a
l'implementeur pour pouvoir mettre en place ce type d'optimisation.
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
Ca fait beaucoup d'hypotheses non necessairement verifiees dans certains
cas pratiques, tout ca.
In article <485becb1$0$913$,
Wykaaa wrote:Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une variable
temporaire sur la pile :-).
Trop peremptoire et faux. Sur pas mal de processeurs, une grosse
proportion des passages de parametres par valeur se font par registres.
Sur des compilateurs un peu plus futes que ceux que tu as ecrit, il peut
y avoir une analyse de flux suffisante pour se passer de toute copie
si elle n'est pas necessaire (par exemple, si un parametre est passe
a une fonction feuille, et que cette fonction ne modifie pas ce parametre,
le compilateur peut tres bien passer la variable elle-meme si elle est
deja dans le bon registre, voire s'arranger pour allouer la variable
dans le bon registre directement).
La norme est justement ecrite par des gens qui comprennent le fonctionnement
de ce genre de compilateurs, et qui laissent suffisamment de marge a
l'implementeur pour pouvoir mettre en place ce type d'optimisation.
C'est ce temporaire qui est affecté dans la fonction si le paramètre est
passé par valeur et qu'il est affecté dans la fonction. Point barre.
Ca fait beaucoup d'hypotheses non necessairement verifiees dans certains
cas pratiques, tout ca.
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une
variable temporaire sur la pile :-).
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une
variable temporaire sur la pile :-).
Il suffit de regarder l'assembleur généré par les compilateurs pour
s'apercevoir que tous créent des variables temporaires pour ce faire.
J'ai fait des compilateurs. Je sais de quoi je parle.
Explique-moi comment faire un passage par valeur sans créer une
variable temporaire sur la pile :-).