Re: Point de sequencement dans un appel de function
[ Nouvelle discussion
| Répondre au groupe
|
fr.comp.lang.c ]
Sujet: Re: Point de sequencement dans un appel de function
De: c_cand...@free.fr (candide)
Groupes: fr.comp.lang.c
Organisation: Guest of ProXad - France
Date: 28. Apr 2008, 14:27:42
References: 1 2 3
|
candide a écrit :
> ii) object is modified and accessed other than to determine the new value
>
> (ce dernier point ne me paraissant pas très clair).
> An object is modified more than once, or is modified and accessed
> other than to determine the new value, between two sequence points
>
J'ai lu vos explications mais ce n'est toujours pas limpide. La phrase
ci-dessus (extrait de C90, la version de C99 étant légèrement
différente) signifie-elle :
"[Le comportement est indéterminé si] Entre deux points de séquencement,
un objet est modifié plus d'une fois ou s'il est modifié et lu(*) dans
un autre but que de déterminer sa nouvelle valeur"
?
_________
(*)"est accédé" ne me semble pas français. C99 utilise le terme de "lu".
Est-ce que ce "other than ..." est destiné à nous autoriser à écrire :
printf("%d", i++);
(sans conviction : i est bien modifié et lu et i++ donne la nouvelle
valeur).
Mais, la deuxième expression i dans
printf("%d %d", i++, i );
a bien pour but de déterminer la nouvelle valeur, donc le "other than"
me dit que j'ai le droit, non ?
Sinon, je comprends pas fondamentalement pourquoi ceci
printf("%d %p", i++, (void *)&i );
m'envoie le même genre de warning que ci-dessus,
parce que (void *)&i ne cherche pas à déterminer la nouvelle valeur de
l'objet modifié, elle cherche à accéder à son adresse.
D'après ce que j'ai lu, la fin de la phrase est connue pour poser des
problèmes de compréhension, cf. clc faq :
-----------------------------------------------------------
"Furthermore, the prior value shall be accessed
only to determine the value to be stored."
The second sentence can be difficult to understand.
[des explications non convaincantes suivaient et disant pour faire
direct qu'il faut pas mélanger i et i++ entre deux sequence points]
-----------------------------------------------------------
et les explications sont assez contorsionnées, exemple d'un auteur
fiable lu dans les archives de clc :
-----------------------------------------------------------------
In a[i] = i++ the value of i is both read and modified and the process
of reading the value of i is independent of the process of calculating
the new value to be written to i. So a[i] = i++ violates the requirement
"Furthermore, the prior value shall be accessed only to determine the
value to be stored".
-----------------------------------------------------------------
A défaut d'expliquer les arcanes de la norme, je pense qu'un manuel de C
devrait mettre en garde contre ce genre de comportement tordu.
Sinon, toujours à propos des points de séquencement, dans la fclc-faq
(il y a l'équivalent du problème dans la clc-faq) :
-----------------------------------------------------------------
10.6 En est-il de même pour i++ * i++ ?
Oui. La norme ne précise pas pour les opérateurs binaires dans
quel ordre les opérandes sont évalués.
-----------------------------------------------------------------
Je trouve cette explication vraiment douteuse (désolé, je ne veux
blesser personne). Si c'était une affaire d'ordre d'évaluation, on
aurait a priori, un résultat dépendant de l'implémentation. Non, je
pense qu'il faut invoquer le point de la norme déjà signalé. S'il n'y
avait pas ce point, vu qu'il n'y de point de séquencement qu'à la fin de
l'expression, si au départ i=5, la valeur retournée devrait être 25
(indépendamment de l'ordre d'évaluation), non ?
Au passage, la réponse à la question précédente n'est vraiment pas
satisfaisante :
"
Ce genre d'expression fait partie des « undefined
behaviour », ou comportement indéfini. Cela signifie que le
résultat d'une telle opération dépend du compilateur.
L'opérateur ++ modifie la valeur de i, alors que
celle-ci est utilisée ailleurs dans l'expression.
C'est ce que l'on appelle un « effet de bords »."

|
 cette fonctionnalité est reservée aux membres ayant une session active !
|