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: 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)


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)