accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Re: Point de sequencement dans un appel de function

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.lang.c ] 

Retour : Accueil du site fr comp lang c   charte stats de ce groupe


  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 »."


DateSujet  Auteur
01.01.
o 
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)
Usenet Gratuit