if(f() || g())
l'ordre d'exécution des fonctions f et g n'était pas garanti, ou un truc du genre, ça vous dit quelque chose ?
Edit: si un modérateur passe, il serait gentil d'enlever le premier accent dans "éxécution" dans le titre

Uther (./10) :
En JAVA tout n'est pas évalué de gauche a droite, ca dépend des opérateurs mais le sens est en effet garanti par les specs.
Les affectation notamment fonctionnent de droite à gauche ce qui fait que l'on peut faire le classique x=y=z=10;
squalyl (./14) :
ça dépend carrément de l'optimisation de l'expression en cours, puisque le but est d'économiser les registres.
Seul java garantit un ordre d'évaluation.
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)
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 ~ $
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)
+ / \ x x inc inc
mtrapier@prod500 ~ $ cat xpp.c #include <stdio.h> int main() { int x, z; x = 1; printf("x=%d\n", x); z = (x++)+(x++); printf("x=%d z=%d after [z=(x++)+(x++)]\n", x, z); return 0; } mtrapier@prod500 ~ $ gcc xpp.c -o xpp.app mtrapier@prod500 ~ $ ./xpp.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $
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 ~ $
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.
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.
squalyl (./23) :
donc il fait 1+2 et le "++" est un sequence point
squalyl (./25) :
sans doute
en fait tout est défini, faut juste savoir comment
mtrapier@prod500 ~ $ cat xpp.c #include <stdio.h> int main() { int x, z; x = 1; printf("x=%d\n", x); z = (x++)+(x++); printf("x=%d z=%d after [z=(x++)+(x++)]\n", x, z); return 0; } mtrapier@prod500 ~ $ gcc xpp.c -o xpp.app mtrapier@prod500 ~ $ ./xpp.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $ gcc xpp.c -O1 -o xpp-o1.app mtrapier@prod500 ~ $ gcc xpp.c -O2 -o xpp-o2.app mtrapier@prod500 ~ $ gcc xpp.c -O3 -o xpp-o3.app mtrapier@prod500 ~ $ gcc xpp.c -Os -o xpp-os.app mtrapier@prod500 ~ $ ./xpp-o1.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $ ./xpp-o2.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $ ./xpp-o3.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $ ./xpp-os.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $
mtrapier@prod500 ~ $ gcc xpp.c -O9 -o xpp-o9.app mtrapier@prod500 ~ $ ./xpp-o9.app x=1 x=3 z=2 after [z=(x++)+(x++)] mtrapier@prod500 ~ $
Pollux (./26) :
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 ^^