La accepté de répondre -- précisant que c'est à cause de la priorité-et le highed upvoted réponse -- précisant que c'est en raison d'une combinaison de l'associativité et la priorité -- deux sont mauvais. (Les réponses sont à la fois maintenant supprimé). Heureusement qu'ils ont tort d'une manière qui présente une valeur éducative!
Permettez-moi de dire très clairement, parce que les gens ne comprennent pas cela tout le temps:
L'ordre d'évaluation des sous-expressions est indépendant à la fois de l'associativité et de préséance. L'associativité et la priorité de déterminer dans quel ordre les opérateurs sont exécutés, mais ne pas déterminer dans quel ordre les sous-expressions sont évaluées. Votre question est sur l'ordre dans lequel les sous-expressions sont évaluées.
Envisager A() + B() + C() * D()
. La Multiplication est une priorité plus élevée qu'ailleurs, et plus est de gauche associative, donc c'est équivalent à (A() + B()) + (C() * D())
, Mais en sachant que seulement vous dit que la première addition n'arrivera pas avant la deuxième plus, et que la multiplication n'arrivera pas avant la deuxième plus. Il ne vous dit pas dans quel ordre A(), B () C() et D() sera appelée! (Cela ne doit pas vous dire si la multiplication a lieu avant ou après la première). Il serait parfaitement possible d'obéir aux règles de priorité et associativité des opérateurs par la compilation de ce que:
d = D() // these four computations can happen in any order
b = B()
c = C()
a = A()
sum = a + b // these two computations can happen in any order
product = c * d
result = sum + product // this has to happen last
Toutes les règles de priorité et associativité des opérateurs sont suivies -- la première addition arrive avant la seconde addition et la multiplication a lieu avant la deuxième plus. Clairement, nous pouvons faire les appels pour A(), B () C() et D() dans tout l'ordre et de toujours obéir aux règles de priorité et associativité des opérateurs!
Nous avons besoin d'une règle sans rapport avec les règles de priorité et associativité des opérateurs pour expliquer l'ordre dans lequel les sous-expressions sont évaluées. La règle de Java et C#) est "sous-expressions sont évaluées de gauche à droite". Depuis Une() apparaît à la gauche de C (), () est évalué en premier, indépendamment du fait que C() est impliqué dans une multiplication et Une() est impliqué que dans une outre.
Alors maintenant, vous avez assez d'informations pour répondre à votre question. En a[b] = b = 0
les règles d'associativité dire que c'est l' a[b] = (b = 0);
, mais cela ne signifie pas que l' b=0
s'exécute en premier! Les règles de préséance dire que l'indexation est une priorité plus élevée que la cession, mais cela ne signifie pas que l'indexation s'exécute avant la valeur la plus à droite.
Les règles de priorité et associativité des opérateurs imposer les restrictions qui:
- L'indexeur opération doit s'exécuter avant l'opération associée à la gauche de cette opération, le
- L'opération associée à la partie droite de l'affectation de l'opération doit s'exécuter avant que associé à la gauche de cette opération.
La priorité et l'associativité de nous dire que la cession de zéro à l' b
doivent se produire avant que la cession a[b]
. Priorité et associativité des opérateurs ne dit rien au sujet de l' a[b]
est évaluée avant ou après l' b=0
.
Encore une fois, c'est la même chose que: A()[B()] = C()
-- Tout ce que nous savons, c'est que l'indexation a lieu avant la cession. Nous ne savons pas si A(), B) ou C() s'exécute en premier fondé sur la priorité et l'associativité. Nous avons besoin d'une règle pour nous dire que.
La règle est, de nouveau, "quand vous avez un choix à propos de quoi faire en premier, toujours aller de gauche à droite": l' a[b]
est à la gauche de l' b=0
, de sorte que l' a[b]
s'exécute d'abord, résultant en a[1]
. Puis l' b=0
qui se passe, et puis l'affectation de la valeur de a[1]
arrive en dernier.
Choses à la gauche de se produire avant que les choses vers la droite. C'est la règle que vous cherchez. Parler de priorité et associativité des opérateurs est à la fois déroutant et hors de propos.
Les gens obtiennent ce trompent tout le temps, même les gens qui devraient savoir mieux. J'ai édité beaucoup trop de livres de programmation qui avaient déclaré que les règles de façon incorrecte, il n'est pas surprenant que beaucoup de gens ont complètement des croyances erronées au sujet de la relation entre la préséance/associativité, et l'ordre d'évaluation, à savoir que, en réalité, il n'existe pas de telle relation; ils sont indépendants.
Si ce sujet vous intéresse, voir mes articles sur le sujet pour en savoir plus:
http://blogs.msdn.com/b/ericlippert/archive/tags/precedence/
Ils sont sur le C#, mais la plupart de ce genre de choses s'applique aussi bien à Java.