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.
Pour être plus précis, le C définit des "sequence points", qui sont grosso modo des barrières dans le code garantissant que tous les effets de bord précédents ont bien été pris en compte et qu'aucun des suivants ne l'a été. Entre autres éléments qui définissent un sequence point :
=> L'évaluation d'une expression complète (que ce soit un initializer, la condition d'un if/while ou simplement un

=> La fin de l'évaluation de l'opérande gauche des opérateurs &&, ||, ? et , (et logique, ou logique, opérateur ternaire, et virgule).
=> L'appel d'une fonction définit un sequence point après l'évaluation de tous les arguments
Pour le
./1, c'est le deuxième point qui nous intéresse, et nous garantit que l'évaluation de l'opérande de gauche du || sera toujours complète, avec tous ses effets de bord pris en compte, avant même que le code se demande s'il doit passer au côté droit.