|
|
Up |
|
|
  |
Author: candidecandide 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 |
|
  |
Author: Marc BoyerMarc 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 |
|
  |
Author: candidecandide 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 |
|
  |
Author: Jean-Marc BourguetJean-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 |
|
  |
Author: Marc BoyerMarc 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 |
|
  |
Author: candidecandide 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 |
|
  |
|
|
  |
Author: Marc BoyerMarc 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 |
|
  |
|
|
  |
|
|
  |
Author: Xavier RocheXavier 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 |
|
|
|
|