Point de sequencement dans un appel de function
  Home FAQ Contact Sign in
fr.comp.lang.c only
 
Advanced search
POPULAR GROUPS

more...

fr.comp.lang.c Profile…
 Up
Point de sequencement dans un appel de function         


Author: candide
Date: Apr 28, 2008 01:56

Bonjour,

Soit le code :

----------------------
#include

int main(void)
{
int i = 10;

printf("%%d %%d \n", i++,i);
return 0;
}
----------------------

qui, à la compilation, m'affiche ceci :

----------------------
candide@candide-desktop:~$ gcc -W -Wall -pedantic -o x test.c
test.c: In function «main":
test.c:7: attention : operation on «i" may be undefined
----------------------
Show full article (1.20Kb)
9 Comments
Re: Point de sequencement dans un appel de function         


Author: Marc Boyer
Date: Apr 28, 2008 02:01

On 2008-04-28, candide wrote:
> Bonjour,
>
> Soit le code :
>
> ----------------------
> #include
>
> int main(void)
> {
> int i = 10;
>
> printf("%%d %%d \n", i++,i);
> return 0;
> }
> ----------------------
>
> qui, à la compilation, m'affiche ceci :
>
> ---------------------- ...
Show full article (1.68Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: candide
Date: Apr 28, 2008 02:08

Marc Boyer a écrit :
>> (...)
>> An object is modified more than once, or is modified and accessed
>> other than to determine the new value, between two sequence points
>
> Exactement.

Très exactement, qu'est-ce qui n'est pas respecté ?

Ceci :

i) object is modified more than once,

ou bien ceci :

ii) object is modified and accessed other than to determine the new value

(ce dernier point ne me paraissant pas très clair).
no comments
Re: Point de sequencement dans un appel de function         


Author: Jean-Marc Bourguet
Date: Apr 28, 2008 02:14

candide writes:
> ii) object is modified and accessed other than to determine the new value

printf("%%d %%d \n", i++,i);

i est lu deux fois et la deuxieme (dans l'ordre d'ecriture, pas dans celle
d'execution et c'est la une partie du probleme) ne sert a calculer la
nouvelle valeur, donc c'est problematique (la premiere lecture -- a nouveau
dans l'ordre d'ecriture -- sert a determiner la nouvelle valeur).

A+

no comments
Re: Point de sequencement dans un appel de function         


Author: Marc Boyer
Date: Apr 28, 2008 02:16

On 2008-04-28, candide wrote:
> Marc Boyer a écrit :
>
>>> (...)
>>> An object is modified more than once, or is modified and accessed
>>> other than to determine the new value, between two sequence points
>>
>> Exactement.
>
> Très exactement, qu'est-ce qui n'est pas respecté ?
>
> Ceci :
>
> i) object is modified more than once,

Ben non, puisqu'il y a un seul ++.
Show full article (0.95Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: candide
Date: Apr 28, 2008 05:27

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++);
Show full article (3.99Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: candide
Date: Apr 28, 2008 05:34

candide a écrit :
Show full article (0.76Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: Marc Boyer
Date: Apr 28, 2008 05:41

On 2008-04-28, candide 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 ...
Show full article (4.27Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: Erwan David
Date: Apr 28, 2008 05:47

candide écrivait :
Show full article (0.98Kb)
no comments
Re: Point de sequencement dans un appel de function         


Author: Xavier Roche
Date: Apr 28, 2008 11:54

candide a écrit :
> printf("%%d %%d \n", i++,i);

Pour compléter, de mémoire, en mode optimisé, les compilateurs auront
tendance a effectuer les effets de bord d'un seule traite, après
l'évaluation des arguments.

Et donc cette ligne pourrait très bien être décomposée par le
compilateur en:

printf("%%d %%d \n", i,i);
i++;

[on oublie que le call force un point de séquence, et que donc le i++
est garanti d'être réalisé juste avant l'appel, même s'il n'est pas
garanti d'être réalisé lors de l'évaluation des arguments]
no comments