JavaScript et Java ont à peu près strictement de gauche-à-droite pour les règles d'évaluation de cette expression. C n'est pas (même dans la version que vous avez fournie, qui est la fonction identité (intervenant)).
L'ECMAScript spec que j'ai (3e Édition, qui je vous l'avoue est assez ancien – la version actuelle peut être trouvé ici: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf- dit que le composé de l'affectation des opérateurs sont évalués comme suit:
11.13.2 Composé d'Affectation ( op= )
La production AssignmentExpression : LeftHandSideExpression @ =
AssignmentExpression, où@ représente l'un des opérateurs indiqué
ci-dessus, est évaluée comme suit:
- Évaluer LeftHandSideExpression.
- Appel GetValue(Résultat(1)).
- Évaluer AssignmentExpression.
- Appel GetValue(Résultat(3)).
- Appliquer l'opérateur @ en Résultat(2) et(4).
- Appel PutValue(Résultat(1), (5)).
- Résultat De Retour(5)
Vous notez que Java a le même comportement que le JavaScript je pense que sa spécification est plus lisible, donc je vais poster quelques extraits ici (http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7):
15.7 Ordre D'Évaluation
Le langage de programmation Java garantit que les opérandes de
les opérateurs semblent être évalué dans un ordre d'évaluation,
à savoir, de gauche à droite.
Il est recommandé que le code ne dépendent fondamentalement de la présente spécification.
Le Code est généralement plus clair lors de chaque expression contient au plus un côté
effet, comme son ultrapériphériques de l'opération, et lorsque le code ne dépend pas de
exactement les exceptions qui se pose comme une conséquence de la gauche-à-droite
l'évaluation des expressions.
15.7.1 Évaluer de Gauche Premier Opérande gauche de l'opérande d'un opérateur binaire semble être pleinement évalués avant qu'une partie de la
de la main droite opérande est évaluée. Par exemple, si la gauche opérande
contient une affectation à une variable et la partie droite de l'opérande
contient une référence à la même variable, alors la valeur produite par
la référence tiendra compte du fait que la cession s'est produite
d'abord.
...
Si l'opérateur est un composé opérateur d'affectation (§15.26.2), puis
évaluation de la gauche opérande comprend à la fois de se souvenir de la
variable que la gauche opérande indique et de l'extraction et de l'économie
que la valeur de la variable pour une utilisation dans l'implicite combinant l'opération.
D'autre part, dans le pas-undefined-comportement exemple, lorsque vous fournissez un intermédiaire de l'identité de la fonction:
x += id(x += 1);
alors que ce n'est pas un comportement indéfini (depuis l'appel de la fonction fournit un point de séquence), c'est toujours un comportement non spécifié si la gauche x
est évaluée avant l'appel de fonction ou après. Ainsi, alors que c'est pas "n'importe quoi" va de comportement indéfini, le compilateur C est encore permis d'évaluer à la fois x
variables avant l'appel de la id()
fonction, auquel cas la dernière valeur stockée dans la variable sera 1
:
Par exemple, si x == 0
pour commencer, l'évaluation pourrait ressembler à:
tmp = x; // tmp == 0
x = tmp + id( x = tmp + 1)
// x == 1 at this point
ou il pourrait l'évaluer comme suit:
tmp = id( x = x + 1); // tmp == 1, x == 1
x = x + tmp;
// x == 2 at this point
Note qu'un comportement non spécifié est subtilement différent de comportement indéfini, mais c'est toujours pas souhaitable de comportement.