Godzil (./18) :
Pollux (./15) :
Euh non là pas du tout, tu confonds associativité et ordre d'évaluation : l'associativité, c'est ce qui fait que x-y-z est compris comme (x-y)-z et pas x-(y-z) ; alors que l'ordre d'évaluation, c'est ce qui fait que x+(x++) équivaut à 2*(x++) et pas à 2*(x++)+1 (en Java en tout cas, en C c'est du code invalide)
Raté :
mtrapier@prod500 ~ $ cat test.c
#include <stdio.h>
int main()
{
int x;
x = 1;
printf("x=%d\n", x);
x = x+(x++);
printf("x=%d after [x=x+(x++)]\n", x);
return 0;
}
mtrapier@prod500 ~ $ gcc test.c -o test.app
mtrapier@prod500 ~ $ ./test.app
x=1
x=3 after [x=x+(x++)]
mtrapier@prod500 ~ $
c'est toi le raté

c'est pas parce que gcc te produit un exécutable que ton code est valide...
Norme C99 :
Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
donc tu as bien une undefined behaviour ^^ ton raisonnement c'est comme si tu voyais que strlen(NULL) vaut 0 sur TI et que tu en déduisais que ça ne plante donc sur aucune plateforme...
spectras (./20) :
Pollux (./15) :
l'ordre d'évaluation, c'est ce qui fait que x+(x++) équivaut à 2*(x++) et pas à 2*(x++)+1 (en Java en tout cas, en C c'est du code invalide)
Mauvais example. C'est du code parfaitement valide au résultat clairement défini.
En revanche, (X++)+(X++), bien qu'étant également parfaitement valide, donne un résultat non défini.
Ben non, les deux sont du code invalide (enfin, invalide seulement s'il est exécuté, bien sûr), autrement dit non seulement le résultat n'est pas défini mais en plus ça peut très bien planter ^^