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: Marc.Bo...@enseeiht.yahoo.fr.invalid (Marc Boyer)
Groupes: fr.comp.lang.c
Organisation: CICT
Date: 28. Apr 2008, 12:41:41
References: 1 2 3 4
|
On 2008-04-28, candide <c_candide@free.fr> wrote:
> 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"
C'est comme ça que je le comprends.
> (*)"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).
C'est comme ça que je le comprends.
> 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 ?
A ben non. C'est un accès "normal".
> 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.
Alors là... En fait, il faut voir si le warning détecte un
véritable UB, ou si c'est une fausse alerte.
Parce qu'à mon sens, "&i" n'est pas un accès à l'objet i.
J'aurais tendance à parier sur une fausse alerte (mais pas
trop d'argent quand même...)
> -----------------------------------------------------------------
> 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.
Oui. Mon cours le fait d'ailleurs.
> 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).
Ton raisonnement ce tient.
> 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 ?
Je suis plutôt d'accord avec toi.
> 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 »."
Ben, la FAQ n'est pas parfaite. Si tu veux lancer une discussion sur
le sujet, vas-y.
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

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